Dlaczego kompilator jest w stanie poprawnie wywnioskować parametr typu String
w przypadku zwracania typu funkcji.Wnioskowanie typu generics Java 7: wartość zwracana vs argument metody
public class Generics {
private static List<String> function() {
return new ArrayList<>();
}
}
ale nie wtedy, gdy typ wywnioskować to parametr metoda:
public class Generics {
public static void main(String[] args) {
method(new ArrayList<>());
}
private static void method(List<String> list) {
}
}
Błąd w tym przypadku jest:
The method method(List<String>) in the type Generics is not applicable
for the arguments (ArrayList<Object>)
Ponieważ nie zawracali sobie głowy wdrażaniem wnioskowania o rodzajach, gdziekolwiek byłoby to możliwe. Nie testowałem tego konkretnego przypadku, ale Java 8 przynosi wiele ulepszeń dotyczących inferencji typów, aby pomóc w lambdach. –
Dzieje się tak dlatego, że idealne wnioskowanie o typie jest zbyt trudnym zadaniem do rozwiązania w skończonym czasie (jest ono na tej samej kolejności złożoności co problem z zatrzymaniem). W związku z tym programiści Javy musieli narysować gdzieś linię. Jak zauważyli inni, ciągle przesuwają linię dalej, ale muszą istnieć pewne ograniczenia. –
@KonstantinNaryshkin: praca wykonana na Javie 8 pokazuje, że narysowali linię na wcześniej. Bardziej użyteczne zasady * są * możliwe i * są integrowane * w Javie 8. Łatwo powiedzieć, że powinni byli popchnąć to dalej za pierwszym razem, ale ciężko jest przewidzieć, która dodatkowa praca przynosi rzeczywiste korzyści. W sumie początkowa implementacja była całkiem przydatna. Ale mogło to zostać wcześniej poprawione. –