2013-01-02 8 views
11

E 'possibile definire un limite generico che:Puoi definire un limite generico che abbia entrambi i limiti inferiore e superiore?

  • implementa un'interfaccia SomeInterface
  • è una superclasse di una classe MyClass

Qualcosa di simile:

Collection<? extends SomeInterface & super MyClass> c; // doesn't compile 
+0

Per motivi di record, Angelika Langer offre un interessante punto di vista in [questo articolo] (http://angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#FAQ107) sul perché * limiti inferiori * sul tipo di classe i parametri praticamente non ha senso. –

risposta

3

Secondo il spec, il risposta sarebbe no (si può avere super o extends, ma non entrambi):

 TypeArguments: 
    <TypeArgumentList> 

TypeArgumentList: 
    TypeArgument 
    TypeArgumentList , TypeArgument 

TypeArgument: 
    ReferenceType 
    Wildcard 

Wildcard: 
    ? WildcardBoundsopt 

WildcardBounds: 
    extends ReferenceType 
    super ReferenceType
+0

Penso che la risposta sia così semplice come l'hai formulata. L'altra risposta è sconcertata, ma in realtà non offre una soluzione alternativa. – Bohemian

2

Non è possibile usa il tipo generico (T nel tuo caso) con dei limiti quando dichiari una variabile.

Deve essere un carattere jolly (?) oppure utilizzare solo il tipo generico completo della classe.

E.g.

// Here only extends is allowed 
class My< T extends SomeInterface > 
{ 

    // If using T, then no bounds are allowed 
    private Collection<T> var1; 

    private Collection< ? extends SomeInterface > var2; 

    // Cannot have extends and super on the same wildcard declaration 
    private Collection< ? super MyClass > var3; 

    // You can use T as a bound for wildcard 
    private Collection< ? super T > var4; 

    private Collection< ? extends T > var5; 

} 

In alcuni casi, si può stringere la dichiarazione aggiungendo il parametro più generico per una classe (o metodo) e l'aggiunta di un balzo in quel parametro particolare:

class My < 
    T extends MyClass<I>, 
    I extends SomeInterface 
> 
{ 
} 
+0

Alex - hai ragione riguardo al 'T' - l'ho cambiato in'? '. (Era solo per scopi illustrativi) – Bohemian

Problemi correlati