Меня больше всего смущает одна вещь: если параметр типа появляется только в возвращаемом типе, компилятор может вывести его из строя.
<T> T foo();
foo(); // fail, no idea what T is
Этот пример понятен, но следующее не
void bar(String s){..}
bar( foo() ); // fail, compiler can't infer T=String
Люди очень расстроены, что компилятор не может вывести простой случай, подобный этому.
Только в 2 контекстах (оба «преобразования назначения») Java может вывести T
String s = foo(); // ok, T=String
String doo()
{
return foo(); // ok, T=String
}
(Хотя он компилируется, он очень опасен. Как, черт возьми, foo()
знает, что он должен возвращать String
? Из-за стирания типа у него нет доступа к T
во время выполнения. Java будет лучше, если он не позволил сделать вывод даже в этих двух случаях.)
Конечно, когда вывод не удался, вы всегда можете предоставить параметр типа explicity.