Защо в Java нетипично извикване на конструктор от параметризиран тип провокира предупреждение за компилатор? Защо е добре да правите подобно нещо със статичен метод? Например:
class Test<T> {
Test() {}
static <T> Test<T> create() {
return new Test<T>();
}
@SuppressWarnings("unused")
public static void main(String[] args) {
Test<String> warning = new Test(); // compiler warning - why?
Test<String> okay = Test.create(); // no warning here - why?
Test<String> okay2 = Test.<String>create(); // why doesn"t it need this?
}
}
Отговори:
8 за отговор № 1Тъй като присвоявате нетипизиран екземпляр на въведена променлива. Трите ви случая:
- защото
new Test<String>()
би било правилно. - Тъй като Java поддържа автоматичен извод за тип въз основа на типа връщане, т.е. той може да предполага генеричния аргумент на missign тук, и вътре метода, вие направихте explict от родовия тип, като използвате
new Test<T>()
(вместо простоnew Test()
). - Заради 2. ;-)
1 за отговор № 2
Java прави изводи за методите (поради което ред 2 работи, а ред 3 не е необходим), но не и за конструктори (поради което ред 1 дава предупреждение).
Би било хубаво, ако Java направи и извод за конструктори, но за Java 6 това не го прави.