Рассмотрим следующий общий класс Base<ID>
с нестационарным внутренним классом.Почему компилятор Eclipse Java жалуется на неконтролируемый отбор для внутренних производных типов?
public class Base<ID> {
ID id;
public Base(ID id) {
this.id = id;
}
public ID getId() {
return id;
}
protected class BaseInner {
String text = "Inner";
}
protected void method(BaseInner o) {
o.text = "Foo";
}
}
Метод Base.method
принимает аргумент типа BaseInner
. Теперь рассмотрим следующие производные классы.
public class Sub<ID> extends Base<ID> {
public Sub(ID id) {
super(id);
}
@Override
protected void method(BaseInner o) {
if (o instanceof Sub.SubInner) {
SubInner sub = (SubInner) o; // Why does this cast emit an "unchecked cast" warning
sub.text = "Bar";
sub.value = 1337;
}
}
protected class SubInner extends BaseInner {
Number value = 42;
}
}
Класс Sub
происходит от Base
и внутренний класс SubInner
вытекает из внутреннего класса BaseInner
. Параметр общего типа ID
из Sub
передается как аргумент типа базовому классу Base
.
Мой вопрос: Почему компилятор жалуется на отлитого из BaseInner
к SubInner
в наиважнейшей method
из Sub
?
Чтобы понять это предупреждение, я попытался построить прецедент, в котором вызывается method
с некоторым Sub<B>.SubInner
, что оправдывает предупреждение. Но все, что я могу придумать (включаяи ? super
), выдает ошибку компилятора при вызове метода, если типы несовместимы.
Так что, я думаю, нет никаких оснований для предупреждения о неконтролированном литье в method
. Я что-то пропустил?
Как переопределение метода происходит в реализации Sub<ID>
, компилятор способен вычесть общий тип SubInner
в Sub<ID>.SubInner
. Так что вопрос не дубликат!
Затмения
Тип безопасность: Переполнение отлито из базы < ID> .BaseInner к югу < ID> .SubInner
Варинг не меняет ни, если я не использовать Base<ID>.BaseInner
как параметр метода, и если я использую Sub<ID>.SubInner
в выраженном выражении.
Просто догадаться, но поскольку вы используете 'o instanceof Sub.SubInner' в инструкции if, вы не должны использовать' Sub.SubInner' в следующем выражении? – nbro
Я уже пробовал это, а также используя 'Sub .SubInner' в роли, но он всегда вызывает то же предупреждение. –
niks
Какой компилятор вы используете? Я не получаю никаких предупреждений с javac 8. – assylias