A generikus típus olyan generikus osztály vagy interfész, amelyet típusokra paraméterezünk. Ez lehetővé teszi, hogy a fordító kikényszerítse a típusbiztonságot az osztályon vagy az interfészen.
Vegyük szemügyre ezt a nem generikus Container interfészt:
class Container {
private Object object;
public void set(Object object) { this.object = object; }
public Object get() { return object; }
}
Mivel Object típusokat fogad és ad vissza, bármilyen nem primitív típussal működik.
Ez azonban áldozattal jár, mert előfordulhat, hogy az egyik kódrészlet Integer értékekre számítva hívja meg a get metódust, miközben egy másik kódrészlet String értékeket adva hívja a set metódust, ami futásidejű kivételhez vezet.
A generikus osztály és a generikus interfész formátuma a következő:
class ClassName<T1, T2, ..., Tn> { ... }
interface InterfaceName<T1, T2, ..., Tn> { ... }
Az osztály vagy interfész neve után álló, csúcsos zárójelekkel (<>) határolt típusparaméter-szakasz adja meg a típusparamétereket (más néven típusváltozókat): T1, T2, ..., Tn.
Ezeket az osztály vagy interfész törzsében használhatod, hogy megkapd a generikus típusbiztonságot.
Íme a Container generikus változata:
class Container<E> {
private E object;
public void set(E object) { this.object = object; }
public E get() { return object; }
}
Létrehozásakor meg kell adnunk, milyen típust tárol, és a fordító kikényszeríti ezt a megszorítást:
// empty <> can infer from context
Container<String> stringContainer = new Container<>();
// compiler knows this is a String, so it is allowed
stringContainer.set("Some string");
// no cast needed, compiler knows it is a String
String result = stringContainer.get();
// this causes a compiler error:
stringContainer.set(42);
A listák a rendezett sorozatot megvalósító kollekciók Java-ban.
A tömbökkel ellentétben a List mérete növekedhet, hogy bármennyi elemet befogadjon.
Az egyik szabványos implementáció az ArrayList, amelyet egy átméretezhető tömb támogat.
Egy másik szabványos implementáció a LinkedList osztály, amelyet egy kétszeresen láncolt lista támogat.
A List lehet üres, vagy tetszőleges számú elemet tartalmazhat (az ismétlődőket is beleértve).
A List generikus interfész, amelynek típusa megmutatja, milyen típusú objektumokat tartalmazhat.
Például:
List<String> emptyListOfStrings = List.of();
List<Integer> singleInteger = List.of(1);
List<Boolean> threeBooleans = List.of(true, false, true);
List<Object> listWithMultipleTypes = List.of("hello", 1, true);
A List számos hasznos metódussal rendelkezik elemek hozzáadásához, eltávolításához, lekéréséhez és egy elem meglétének ellenőrzéséhez:
List<Character> vowels = new ArrayList<>(List.of('a', 'e', 'i', 'o', 'i', 'e', 'a'));
int startingSize = vowels.size(); // 7
vowels.add('u'); // vowels is now ['a', 'e', 'i', 'o', 'i', 'e', 'a', 'u']
char a = vowels.get(0); // 'a'
boolean hadI = vowels.remove('i'); // true and vowels is now ['a', 'e', 'o', 'i', 'e', 'a', 'u']
boolean hasI = vowels.contains('i'); // true (still have one more left)
Karl listát szeretne vezetni azokról a nyelvekről, amelyeket az Exercism weboldalán szeretne megtanulni. Karlnak új nyelveket kell tudnia hozzáadni, a régieket eltávolítani, és ellenőrizni, hogy bizonyos nyelvek rajta vannak-e a listán. Nagyon izgalmas lenne, ha Karl Javát vagy Kotlint szeretne tanulni!
Karlnak tudnia kell, ha egyszer üres lesz a nyelvek listája, hogy újabbakat kereshessen, amiket megtanulhat!
Definiálj egy isEmpty nevű metódust, amely akkor ad vissza true-t, ha egyetlen nyelv sincs a listában.
if (languageList.isEmpty()) {
findMoreLanguagesToLearn();
}
Karl már alig várja, hogy Kotlint és Pythont tanulhasson!
Segíts Karlnak elkezdeni: definiálj egy addLanguage nevű metódust, amely átveszi a nyelvet, amit meg szeretne tanulni, és hozzáadja a listához.
languageList.addLanguage("Kotlin");
languageList.addLanguage("Python");
Karl úgy döntött, hogy egyelőre nem szeretne Scalát tanulni.
Segíts Karlnak eltávolítani a listáról: definiálj egy removeLanguage nevű metódust, amely átveszi az eltávolítandó nyelvet, és eltávolítja a listáról.
languageList.removeLanguage("Scala");
Karl szeretne emlékezni az első nyelvre, amelyet a listához adott (és amely még mindig rajta van a listán).
Definiálj egy firstLanguage nevű metódust, amely visszaadja a lista első nyelvét.
String kotlin = languageList.firstLanguage(); // "Kotlin"
Karlnak tudnia kell, hány nyelvet próbál megtanulni.
Segíts Karlnak megtalálni a választ: definiálj egy count nevű metódust, amely visszaadja a listában lévő nyelvek számát.
int two = languageList.count(); // 2
Karl éppen azon gondolkodik, hogy a Pythont vagy a Ruby-t akarta-e megtanulni.
Definiálj egy containsLanguage nevű metódust, amely átveszi a nyelvet, amiről érdeklődik, hogy Karl megtudhassa!
boolean learningPython = languageList.containsLanguage("Python"); // true
boolean learningRuby = languageList.containsLanguage("Ruby"); // false
Ha Karl Javát vagy Kotlint szeretne tanulni, az nagyon izgalmas!
Definiálj egy isExciting nevű metódust, amely igazat ad vissza, ha Karl Javát vagy Kotlint szeretne tanulni.
javaLanguageList.isExciting() // true
neitherKotlinNorJavaLanguageList.isExciting() // false
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Java nyelvet 26 fogalom158 feladat segítségével, valódi emberi mentorálással, mindez ingyen.