Java Generics példa oktatóanyag – Általános módszer, osztály, felület
A Java Genrics az egyik legfontosabb szolgáltatás, amelyet a Java 5 vezet be.
Ha a Java Gyűjteményeken és az 5-ös vagy újabb verzióval dolgozott, biztos vagyok benne, hogy Ön használta.
A Java általános és gyűjtési osztályú generikái nagyon egyszerűek, de sokkal több funkciót nyújtanak, mint pusztán a típusú gyűjtemény.
Ebben a cikkben megpróbáljuk megtanulni a generikumok jellemzőit. A generikumok megértése néha zavaróvá válhat, ha zsargonszavakkal járunk, ezért megpróbálnám egyszerűvé és könnyen érthetővé tenni.
Generics a Java-ban
A Generics-et hozzáadták a Java 5-höz, hogy fordításidejű típust ellenőrizzenek és eltávolítsák a munka során gyakori ClassCastException
kockázatát. gyűjtési órákkal. Az egész gyűjtemény keretrendszer át lett írva, hogy a generikusokat felhasználják a típusbiztonság érdekében. Lássuk, hogyan segítenek a generikusok a gyűjteményosztályok biztonságos használatában.
A fenti kód jól összeáll, de futás közben dobja a ClassCastException szolgáltatást, mert a listában lévő Object-et String-be próbáljuk átküldeni, míg az egyik elem Integer típusú. A Java 5 után az alábbihoz hasonló gyűjteményosztályokat használunk.
Vegye figyelembe, hogy a lista létrehozásakor megadtuk, hogy a listában szereplő elemek típusa String lesz. Tehát, ha bármilyen más típusú objektumot megpróbálunk hozzáadni a listához, a program fordítási időbeli hibát dob. Vegye figyelembe azt is, hogy a ciklushoz nincs szükségünk a lista elemének tipizálására, ezért futás közben eltávolítjuk a ClassCastException szolgáltatást.
Java általános osztály
Saját osztályokat definiálhatunk generikus típussal. Az általános típus olyan osztály vagy interfész, amelyet típusok felett paramétereznek. A típusú paraméter megadásához szögletes zárójeleket használunk (< >).
Az előny megértéséhez tegyük fel, hogy egyszerű osztályunk van:
Vegye figyelembe, hogy ennek az osztálynak a használata során a típus castingot kell használnunk, és futás közben képes előállítani a ClassCastException szolgáltatást. Most a java generikus osztályt fogjuk használni ugyanazon osztály átírásához, mint az alábbiakban látható.
Figyelje meg a GenericsType osztály használatát a fő módszerben. Nincs szükségünk típus-castingra, és futás közben eltávolíthatjuk a ClassCastException szolgáltatást. Ha a létrehozáskor nem adjuk meg a típust, a fordító figyelmeztetést ad arra, hogy a “GenericsType nyers típus.
Hivatkozások a GenericsType általános típusra < T > paraméterezni kell. “Ha nem adjuk meg a típust, akkor a típus Object
lesz, ezért mindkét Stringet engedélyezi és egész szám objektumokat. De ezt mindig meg kell próbálnunk elkerülni, mert a type castingot kell használnunk, miközben olyan nyers típuson dolgozunk, amely futásidejű hibákat okozhat.
annotáció a fordító figyelmeztetésének elnyomásához, nézze meg a java annotations oktatóanyagot.
Vegye figyelembe, hogy támogatja a java autoboxolást.
Java általános felület
Az összehasonlítható felület nagyszerű példa a felületeken található Generics-re, és a következőképpen van megírva:
Hasonlóképpen létrehozhatunk általános felületeket a java-ban. több típusú paraméterrel rendelkezik, mint a Map felületen erősítéshez paraméterezett értéket is adhatunk egy paraméterezett típushoz, például new HashMap<String, List<String>>();
érvényes.
Java általános típus
Java általános típusnevezés A konvenció segít nekünk a kód egyszerű megértésében, és a névadási konvenció a Java programozási nyelv egyik legjobb gyakorlata. Tehát a generikusok saját névadási szokásaikkal is járnak. A típusparaméterek neve általában egy nagybetű, így könnyen megkülönböztethető a java változóktól. A leggyakrabban használt típusparaméterek a következők:
- E – Element (amelyet a Java Collections Framework széles körben használ, például ArrayList, Set stb.)
- K – Key ( Használt a térképen)
- N – szám
- T – típus
- V – érték (a térképen használatos)
- S, U, V stb. – 2., 3., 4. típus
Java általános módszer
Néha nem akarjuk, hogy az egész osztály paraméterezve legyen, ebben az esetben java generics módszer létrehozása. Mivel a konstruktor egy speciális típusú módszer, ezért generikus típusokat is használhatunk a konstruktorokban.
Itt egy osztály mutat be egy java generikus metódust.
Figyelje meg az isEqual metódust szintaxist bemutató aláírás az általános típus használatához a módszerekben. Figyelje meg ezeket a módszereket a java programunkban is. Megadhatjuk a típust, miközben meghívjuk ezeket a módszereket, vagy meghívhatjuk őket, mint egy normál módszert. A Java fordító elég okos ahhoz, hogy meghatározza a használandó változó típusát, ezt a lehetőséget típus következtetésnek hívják.
Java Generics Bounded Type Parameters
Tegyük fel, hogy korlátozni akarjuk a paraméterezett típusban használható objektumtípusokat, például két objektumot összehasonlító módszerben, és szeretnénk ellenőrizze, hogy az elfogadott objektumok összehasonlíthatók-e. Korlátozott típusparaméter deklarálásához sorolja fel a típusparaméter nevét, majd az extends kulcsszót, majd annak felső határát, hasonlóan az alábbi módszerhez.
Ezeknek a módszereknek a meghívása hasonló a korlátlan módszerhez, azzal a különbséggel, hogy ha olyan osztályt próbálunk használni, amely nem összehasonlítható, akkor fordítási időbeli hibát fog dobni.
A korlátozott típusú paraméterek használhatók a metódusok mellett osztályok és interfészek.
A Java Generics többféle határt is támogat, azaz < T kiterjeszti A & B & C >. Ebben az esetben A lehet interfész vagy osztály. Ha A osztály, akkor B és C interfésznek kell lennie. Nem lehet több, mint egy osztály többféle korlátban.
Java Generics és öröklődés
Tudjuk, hogy A Java öröklés lehetővé teszi számunkra az A változó hozzárendelését egy másik B változóhoz, ha A B alosztálya. Tehát azt gondolhatnánk, hogy bármely általános A típus rendelhető a B általános típusához, de ez nem így van. Lássuk ezt egy egyszerű programmal.
Nem engedélyezhetjük a MyClass < String > változó hozzárendelését a MyClass-hoz. < Objektum > változó, mert nem kapcsolódnak egymáshoz, valójában MyClass < T > szülő az Object.
Java általános osztályok és altípus
Egy általános osztályt vagy interfészt altípussal bővíthetünk vagy megvalósíthatunk. Az egyik osztály vagy interfész típusparamétereinek és a másik típusparamétereinek kapcsolatát az extends and implement záradék határozza meg.
Az altípus-kapcsolat mindaddig megmarad, amíg nem változtatjuk meg a type argumentumot, az alábbiakban több típusú paraméter példája látható.
A < karakterlánc lehet MyList < karakterlánc, objektum >, MyList < Karakterlánc, egész szám > és így tovább.
Java Generics helyettesítő karakterek
A kérdőjel (?) A helyettesítő karakter a generikusokban, és egy ismeretlen típus. A helyettesítő karakter használható paraméterként, mezőként vagy helyi változóként, és néha visszatérési típusként is. Nem használhatunk helyettesítő karaktereket általános módszer meghívása vagy általános osztály példázása közben. A következő szakaszokban megismerkedhetünk a felső határolt helyettesítő karakterekkel, az alsó határokkal rendelkező helyettesítő karakterekkel és a helyettesítő karakterek elfogadásával.
9.1) A Java Generics felső határolt helyettesítő karakterei
A felső határolású helyettesítő karaktereket a a változó típusának korlátozása egy módszerben. Tegyük fel, hogy olyan metódust akarunk írni, amely visszaadja a számok összegét a listában, így a megvalósításunk valami ilyesmi lesz.
Most a A fenti megvalósítás szerint az nem fog működni az Integers List vagy Doubles listákkal, mert tudjuk, hogy a < Integer > és a < A kettős > nem kapcsolódnak egymáshoz, ilyenkor hasznos a felső határolású helyettesítő karakter. Általános kiterjesztésű helyettesítő karaktereket használunk, kiterjesztve a kulcsszót és a felső korlát osztályt vagy felületet, amely lehetővé teszi számunkra, hogy átadjuk a felső határ vagy annak alosztályainak argumentumát.
A fenti megvalósítás az alábbi programhoz hasonlóan módosítható. >
Hasonló, mint a kód felírása az interfész szempontjából, a fenti módszerben a Number felső osztályú osztály összes metódusát használhatjuk. Ne feledje, hogy felső korlátos listával semmilyen objektumot nem adhatunk a listához, a null kivételével. Ha megpróbálunk hozzáadni egy elemet a sum metóduson belüli listához, a program nem fordítja le.
9.2) Java Generics Korlátlan helyettesítő karakter
Néha előfordulhat olyan helyzet, hogy azt akarjuk, hogy általános módszerünk minden típusnál működjön, ebben az esetben korlátlan helyettesítő karakter használható. Ugyanaz, mint a < használatával? kiterjeszti az > objektumot.
Megadhatjuk a < listát Karakterlánc > vagy a < Karakterlánc > vagy bármely más típusú objektumlista argumentum az printData módszer. A felső határlistához hasonlóan nem adhatunk hozzá semmit a listához.
9.3) Java Generics alsó korlátozású helyettesítő karakter
Tegyük fel, hogy egész számokat akarunk hozzáadni a módszer egész számainak listájához, megtarthatjuk az argumentumtípust egész számként >, de egész számokkal lesz összekötve, míg a < szám > és a < Az > objektum egész számokat is tartalmazhat, így ennek eléréséhez használhatunk egy alsó határozott helyettesítő karaktert is. Ennek eléréséhez általános kulcsokat (?) Használunk szuper kulcsszóval és alsó határú osztállyal.
Argumentumként átadhatjuk az alsó határt vagy az alsó határ bármelyik típusát, ebben az esetben a java fordító lehetővé teszi alacsonyabb hozzáadását. az objektumtípusok a listához vannak kötve.
altípus generikus helyettesítő karakter használatával
Java Generics típusú törlés
Generics A Java hozzá lett adva a típusellenőrzéshez a fordítás idején, és a futás idején nincs haszna, ezért a java fordító a típus törlés funkcióval eltávolítja az összes generikus típusellenőrző kódot a bájtkódból, és ha szükséges, beilleszti a típusküldést. A típus törlése biztosítja, hogy a paraméterezett típusokhoz ne hozzanak létre új osztályokat; következésképpen a generikusok nem futtatnak futásidőt.
Például, ha van egy általános osztályunk, mint az alábbiakban;
A Java fordító a T bekötött típusú paramétert lecseréli az első kötött interfészre, összehasonlítható , az alábbi kóddal:
Generics GYIK
12.1) Miért használjuk a Generics-et a Java-ban?
A Generics erős fordítási idő-típusú ellenőrzést biztosít és csökkenti a ClassCastException és explicit objektumküldés.
12.2) Mi a T a Generics-ben?
A < T > egy általános osztály, interfész és módszer létrehozásához. A T helyére a tényleges típust cseréljük, amikor használjuk.
12.3) Hogyan működik a Generics a Java-ban?
Az általános kód biztosítja a típusbiztonságot. A fordító a type-erasure segítségével eltávolítja az összes típusú paramétert a fordításkor, hogy csökkentse a futásidejű túlterhelést.
Generics a Java-ban – További olvasmányok
Ennyi a java, java generikusok számára a generikumok valóban hatalmas témák, és sok időre van szükségük annak megértéséhez és hatékony felhasználásához. Ez a bejegyzés egy kísérlet a generikus gyógyszerek alapvető részleteinek megadására és arra, hogy miként terjeszthetjük ki programunkat a típusbiztonságra.