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ò.
C'è qualche differenza tra " estende ... 'e'
C'è una differenza in come e dove è possibile utilizzare i caratteri jolly e digitare i parametri. –
@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? –