Параметри на типа в Java Generics

По конвенция имената на параметрите на типа са с единични главни букви. Параметрите на генериците се именуват както следва:

  • E - Елемент (използван широко от Java Collections Framework)

  • K - Ключ

  • N - Число

  • T - Тип

  • V - Стойност

  • S,U,V и т.н. - 2-ри, 3-ти, 4-ти тип

Raw тип се нарича генеричен клас или интерфейс, при употребата на който не са приложени параметри за тип. Като пример можем да разгледаме генерик класа Box:

public class Box<T> {
    public void set(T t) { /* ... */ }
    // ...
}

За да бъде създаден параметризиран тип Box, е необходимо като аргумент на формалния параметър T да се добави използвания за казуса тип:

Box<Integer> intBox = new Box<>();

Но ако аргументът, задаващ използвания тип, се пропусне, се създава raw тип на Box:

Box rawBox = new Box();

Следователно Box е raw тип на генеричния тип Box<T>. Трябва да се има предвид обаче, че обикновените класове и интерфейси не са raw тип.

Raw типове се откриват в наследен (legacy) код, тъй като много API класове (като класовете на колекциите ) не са били генерици преди JDK 5.0. Когато използвате raw типове, вие по същество получавате негенерично поведение - Box ви дава Object s. За обратна съвместимост е разрешено присвояването на параметризиран тип към неговия raw тип:

Box<String> stringBox = new Box<>();
Box rawBox = stringBox;

Но ако присвоите необработен тип на параметризиран тип, получавате предупреждение:

Box<String> stringBox = new Box<>();
Box rawBox = stringBox;
rawBox.set(8);  // warning: unchecked invocation to set(T)

Предупреждението показва, че необработените типове заобикалят общите проверки за типове, като отлагат улавянето на опасен код за времето за изпълнение. Следователно трябва да избягвате използването на сурови видове.

Last updated