Hur använder man klassen i Java?
allt vi vet är ”alla instanser av en klass delar samma java.lang.Klassobjekt av den typen av klass”
t.ex.)
Student a = new Student();Student b = new Student();
då är a.getClass() == b.getClass()
sant.
anta nu
Teacher t = new Teacher();
utan generika är nedanstående möjligt.
Class studentClassRef = t.getClass();
men det här är fel nu ..?
t.ex.)public void printStudentClassInfo(Class studentClassRef) {}
kan anropas medTeacher.class
detta kan undvikas med generika.,
Class<Student> studentClassRef = t.getClass(); //Compilation error.
nu vad är T ?? T är typparametrar (även kallade typvariabler); avgränsad av vinkelfästen (<>), följer klassnamnet.
T är bara en symbol, som ett variabelnamn (kan vara vilket namn som helst) som deklareras under skrivandet av klassfilen. Senare kommer T att ersättas med
giltigt klassnamn under initieringen (HashMap<String> map = new HashMap<String>();
)
t.ex. class name<T1, T2, ..., Tn>
så Class<T>
representerar ett klassobjekt av specifik klasstyp ’T
’.,
anta att dina klassmetoder måste fungera med okända typparametrar som nedan
Här kan T användas somString
typ som CarName
eller T kan användas som Integer
typ som modelNumber,
eller T kan användas som Object
typ som giltig bil exempel.
nu här är ovanstående den enkla POJO som kan användas annorlunda vid körning.
Samlingar t. ex.) lista, uppsättning, Hashmap är bästa exempel som fungerar med olika objekt enligt deklarationen av T, men när vi förklarade T som sträng
e.,g)HashMap<String> map = new HashMap<String>();
då accepterar den endast String Class instance-objekt.
generiska metoder
generiska metoder är metoder som introducerar sina egna typparametrar. Detta liknar att deklarera en generisk typ, men typparameterns omfattning är begränsad till den metod där den deklareras. Statiska och icke-statiska generiska metoder är tillåtna, liksom generiska klasskonstruktörer.
syntaxen för en generisk metod innehåller en typparameter, inom vinkelfästen och visas före metodens returtyp., För generiska metoder måste avsnittet typparameter visas före metodens returtyp.
här <K, V, Z, Y>
är deklarationen av typer som används i metoden argument som bör före returtypen som är boolean
här.
i nedanstående; typdeklaration<T>
krävs inte på metodnivå, eftersom den redan deklareras på klassnivå.
class MyClass<T> { private T myMethod(T a){ return a; }}
men nedan är fel eftersom parametrar av klassnivåtyp K, V, Z och Y inte kan användas i ett statiskt sammanhang (statisk metod här).,
andra giltiga scenarier är
och slutligen behöver statisk metod alltid explicit<T>
deklaration; det kommer inte att härledas från klassnivåClass<T>
. Detta beror på att klassnivå T är bunden med instans.
läs även restriktioner för generika
jokertecken och Undertypning
typargument för en generisk metod