Dlaczego ta niespójność?
Powiedziałbym, że to nie jest żadna niekonsekwencja. Zasadniczo jest to problem zrozumienia generyków. Rozważmy następujący kod (swój kod zmodyfikowany):
class Outer<T> {
class Inner{
T t;//Added this extra line
}
static class Nested {
Inner inner;
}
}
W tym powyższym przykładzie jest nieco podobny do tego, co zostało napisane tylko dodałem nową zmienną t
typu T
który jest generyków Outer
klasie w klasie Inner
. W tym przykładzie powyższy przykład nie zostałby skompilowany, ponieważ w klasie Inner
znajduje się odniesienie niestatyczne lub wykonawcze, więc po zadeklarowaniu Inner
w klasie statycznej Nested
kompilator JAVA nie zna typu T
, który jest tylko zadeklarowany. w środowisku wykonawczym, więc pojawia się błąd. Ale w twoim przypadku nie zrobiłeś nic takiego, ale nadal kompilator nie wie, czy coś takiego jest obecne, czy nie. Więc daje błąd.
Teraz w drugim przypadku usunięto ogólny T
z deklaracji klasy Outer
. Tak więc nie ma możliwości zadeklarowania zmiennej t
w klasie , więc nie ma błędu.
W trzecim przypadku zadeklarowano Outer.Inner
dla typu zmiennej inner
i została ona pomyślnie skompilowana.Tutaj kompilator uznał RAW TYPU RAW TYPU. Należy jednak unikać tego rodzaju deklaracji typu surowego. Więc lepiej byłoby napisać:
Outer<?>.Inner inner;
Tutaj kompilator Java uważa Outer
wziąć dowolny obiekt jako parametry, które dziedziczą Object
.
Cóż, możesz odwołać się do 'T' w' Inner', np. zmienna składowa. W jaki sposób 'Nested' może wiedzieć cokolwiek na temat tego, czy' Outer' jest ogólny? –
Zmień linię na 'Zewnętrzna. Wewnętrzna wewnętrzna;' lub inna specjalizacja 'T' –