2013-10-02 8 views
5

Il seguente codice compila:La classe <V> può assumere più limiti sul tipo generico?

import java.util.ArrayList; 

public class ClassTest 
{ 
    private ArrayList<Class<? extends Interface1>> testClass = 
    new ArrayList<Class<? extends Interface1>>(); 

    private interface Interface1 {} 
} 

Ma il seguente codice produce sei errori:

import java.util.ArrayList; 

public class ClassTest 
{ 
    private ArrayList<Class<? extends Interface1 & Interface2>> testClass = 
    new ArrayList<Class<? extends Interface1 & Interface2>>(); 

    private interface Interface1 {} 
    private interface Interface2 {} 
} 

Errori:

ClassTest.java:5: > expected 
    private ArrayList<Class<? extends Interface1 & Interface2>> testClass = 
              ^
ClassTest.java:5: ';' expected 
    private ArrayList<Class<? extends Interface1 & Interface2>> testClass = 
                 ^
ClassTest.java:5: <identifier> expected 
    private ArrayList<Class<? extends Interface1 & Interface2>> testClass = 
                    ^
ClassTest.java:6: > expected 
    new ArrayList<Class<? extends Interface1 & Interface2>>(); 
              ^
ClassTest.java:6: '(' or '[' expected 
    new ArrayList<Class<? extends Interface1 & Interface2>>(); 
              ^
ClassTest.java:6: illegal start of expression 
    new ArrayList<Class<? extends Interface1 & Interface2>>(); 
                  ^

E 'abbastanza chiaro che il compilatore non riconosce il & in uso per più limiti generici su Class. Non sono consentiti più limiti sul parametro type per Class? Che cosa dovrei fare se voglio un Class di che implementa sia Interface1 e Interface2?

Motivazione: Il codice su cui sto lavorando in questo momento ha un sacco di dichiarazioni come questa:

private static HashMap<String, Class<? extends ApproximativeMode>> approximativeMethod = 
new HashMap<String, Class<? extends ApproximativeMode>>(); 

mappano una stringa a una classe che contiene un 'metodo' per fare un certo calcolo. Ogni hashmap separata utilizza un jolly diverso per le classi (quindi ApproximativeMode potrebbe essere sostituito con ExactMode per l'hashmap contenente tutti i metodi esatti).

Ho appena passato attraverso tutti i metodi, che li implementano una nuova interfaccia, NamedMethod, che ha un metodo che ottiene la loro piena, nome visualizzato (ad esempio, "il metodo hydroxyadenine lineare"). Ora voglio inserire tutte le hashmap in un ArrayList in modo che possa scrivere un iteratore che superi le hashmap e visualizzi i loro nomi completi. Quindi potrei finire con:

Metodi approssimativa

von Ahsen et al.

Owen et al.

ecc

metodi esatti

Santalucia et al.

LHM

ecc

ecc

Quindi la mia dichiarazione del ArrayList detiene la totalità delle HashMaps è:

private ArrayList<Hashmap<String, Class<? extends NamedMethod>>> namedMethods; 

Naturalmente, nessuno dei HashMaps sono in realtà di quel tipo, ma speravo di poter aggiungere NamedMethod al carattere jolly in ognuno di essi e ottenere uno ArrayList di tutti . Chiaramente questo non è possibile.

Se questo non è chiaro, fammelo sapere e lo aggiusterò.

risposta

5

jolly delimita vs Tipo limiti dei parametri:

  • Non si può avere più limiti sul jolly. Puoi averli solo per i parametri del tipo.
  • Un'altra differenza è che è possibile avere limiti superiori e inferiori per i caratteri jolly, ma non esiste un limite inferiore per il parametro di tipo.

Così, come per il 1 ° differenza, se si vuole avere più limiti, allora è necessario utilizzare il parametro tipo dichiarato con la classe. Ciò significa che devi rendere la classe generica stessa. E poi le interfacce dovrebbero essere dichiarate separatamente come interfaccia di primo livello:

public class ClassTest<T extends Interface1 & Interface2> { 
    private ArrayList<Class<T>> testClass = new ArrayList<Class<T>>();  
} 

interface Interface1 {} 
interface Interface2 {} 
+0

C'è qualche differenza tra "

+1

C'è una differenza in come e dove è possibile utilizzare i caratteri jolly e digitare i parametri. –

+0

@Rohit Grazie, ma questo mi permetterebbe solo di istanziare la classe 'ClassTest' con una * particolare * classe che soddisfa i limiti, e quindi creare un' ArrayList' di * quella classe *. Cosa succede se desidero un 'ArrayList' con molte classi diverse in esso, che implementano due interfacce specifiche? –

Problemi correlati