/ / В Java, защо нетипизираното извикване на конструктор на параметризиран тип провокира предупреждение за компилатор? - java, generics

В Java, защо невидирания разговор на конструктор на параметризиран тип провокира предупреждение за компилатор? - ява, генерични лекарства

Защо в 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

Тъй като присвоявате нетипизиран екземпляр на въведена променлива. Трите ви случая:

  1. защото new Test<String>() би било правилно.
  2. Тъй като Java поддържа автоматичен извод за тип въз основа на типа връщане, т.е. той може да предполага генеричния аргумент на missign тук, и вътре метода, вие направихте explict от родовия тип, като използвате new Test<T>() (вместо просто new Test()).
  3. Заради 2. ;-)

1 за отговор № 2

Java прави изводи за методите (поради което ред 2 работи, а ред 3 не е необходим), но не и за конструктори (поради което ред 1 дава предупреждение).

Би било хубаво, ако Java направи и извод за конструктори, но за Java 6 това не го прави.