Узагальнений тип - це узагальнений клас або інтерфейс, параметризований типами. Це дає компілятору змогу забезпечувати типобезпеку класу або інтерфейсу.
Розгляньмо цей неузагальнений інтерфейс Container:
class Container {
private Object object;
public void set(Object object) { this.object = object; }
public Object get() { return object; }
}
Оскільки він приймає й повертає обʼєкти типу Object, він працює з будь-яким непримітивним типом. Однак за це доводиться платити: якийсь код може викликати get, розраховуючи на Integer, а інший код викликає set, додаючи String, що призводить до винятку часу виконання.
Узагальнений клас і узагальнений інтерфейс мають такий формат:
class ClassName<T1, T2, ..., Tn> { ... }
interface InterfaceName<T1, T2, ..., Tn> { ... }
Секція параметрів типу, обмежена кутовими дужками (<>), яка йде після назви класу або інтерфейсу, задає параметри типу (які також називають змінними типу) T1, T2, ..., і Tn. Їх можна використовувати всередині тіла класу або інтерфейсу, щоб отримати типобезпеку узагальнень.
Ось узагальнена версія Container:
class Container<E> {
private E object;
public void set(E object) { this.object = object; }
public E get() { return object; }
}
Коли ми його створюємо, нам тепер треба оголосити, який тип він зберігає, і компілятор забезпечить це обмеження:
// 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);
У Java списки - це впорядкована колекція-послідовність. На відміну від масивів, List може збільшуватися в розмірі, щоб умістити будь-яку кількість елементів. Одна зі стандартних реалізацій - це ArrayList, який базується на масиві, розмір якого можна змінювати. Інша стандартна реалізація - це клас LinkedList, який базується на двозвʼязному списку.
List може бути порожнім або містити будь-яку кількість елементів (зокрема дублікати). List - це узагальнений інтерфейс, типізований так, щоб указувати, які типи обʼєктів він може містити. Наприклад:
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);
List має різні корисні методи, щоб додати елемент, видалити його, отримати або перевірити, чи він наявний:
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)
Карл хоче вести список мов, які збирається вивчати на сайті Exercism. Карлові потрібно вміти додавати нові мови, видаляти старі та перевіряти, чи є певні мови у списку. Було б дуже захопливо, якби Карл захотів вивчати Java або Kotlin!
Карлові потрібно знати, чи його список мов колись стане порожнім, щоб він міг знайти ще щось для вивчення!
Визначте метод під назвою isEmpty, який повертає true, якщо у списку немає жодної мови.
if (languageList.isEmpty()) {
findMoreLanguagesToLearn();
}
Карл з нетерпінням чекає на вивчення Kotlin і Python!
Допоможіть Карлові почати: визначте метод під назвою addLanguage, який приймає мову, яку він хоче вивчати, і додає її до списку.
languageList.addLanguage("Kotlin");
languageList.addLanguage("Python");
Карл вирішив, що зараз не хоче вивчати Scala.
Допоможіть Карлові видалити її зі списку: визначте метод під назвою removeLanguage, який приймає мову, яку він видаляє, і видаляє її зі списку.
languageList.removeLanguage("Scala");
Карл хоче пригадати першу мову, яку він додав до списку (і яка досі в списку).
Визначте метод під назвою firstLanguage, який повертає першу мову в списку.
String kotlin = languageList.firstLanguage(); // "Kotlin"
Карлові потрібно знати, скільки мов він намагається вивчити.
Допоможіть Карлові знайти відповідь: визначте метод під назвою count, який повертає кількість мов у списку.
int two = languageList.count(); // 2
Карл намагається пригадати, чи хотів він вивчати Python або Ruby.
Визначте метод під назвою containsLanguage, який приймає мову, про яку він питає, щоб Карл міг це зʼясувати!
boolean learningPython = languageList.containsLanguage("Python"); // true
boolean learningRuby = languageList.containsLanguage("Ruby"); // false
Якщо Карл хоче вивчати Java або Kotlin, це дуже захопливо!
Визначте метод під назвою isExciting, який повертає true, якщо Карл хоче вивчати Java або Kotlin.
javaLanguageList.isExciting() // true
neitherKotlinNorJavaLanguageList.isExciting() // false
Зареєструйтеся на Exercism, щоб вивчати й опановувати Java, а також 26 концепцій158 вправ та справжнє наставництво від людей, і все це безкоштовно.