考虑以下泛型类Base
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。方法
接受类型为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
。Sub
的泛型类型参数ID
作为类型参数传递给基类base
。
我的问题:为什么编译器会抱怨
Sub
的重写方法
中从Baseine
到Subine
的强制转换?
为了理解这个警告,我试图构建一个用例,其中
子类的
方法
所以我想没有理由在
方法
中警告未检查的强制转换。我错过了什么吗?
方法重写发生在
子
Eclipse编译器警告是
类型安全性:未经检查的从底部铸造
如果我使用
Base,警告也不会改变
在这种情况下,未检查的强制转换意味着您正在从不合格类型强制转换为泛型类型。
Set<String> set = new HashSet();
这一行也将产生未经检查的分配警告。
出现此警告是因为编译器无法推断强制转换在编译时是否安全。
子内部实例引用了子实例。你是在基地投球。BaseInner,所以你也在从一个基地到另一个基地施放
编辑
解决方案是使用通用参数。
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(Base<ID>.BaseInner o) {
o.text = "Foo";
}
}
public class Sub<ID> extends Base<ID> {
public Sub(ID id) {
super(id);
}
@Override
protected void method(Base<ID>.BaseInner o) {
SubInner sub = (SubInner) o;
sub.text = "Bar";
sub.value = 1337;
}
protected class SubInner extends BaseInner {
Number value = 42;
}
}
此接缝是Eclipse编译器问题。
Oracle编译器(javac
)不会在此处忽略任何警告。
我有一个实现Iterable的类,以便用户可以使用迭代器。我使用泛型来允许用户使用任何类型并使用该类。 这是下面的工作代码,没有警告- 但是,如果我将ListIterator定义如下- 我在 Eclipse 中收到警告, 当我在类后指定泛型类型时,它为什么会抱怨?为了能够在我的类中使用Type,我不应该这样做吗?我在定义CustomStackUsingArray时添加了类型,效果很好。
问题内容: 游乐场执行失败:MyPlayground.playground:109:22:错误:无效使用’()’调用非函数类型’[ClassA.ClassB.Type]’的值时,让didNotCompile = ClassA.ClassB ^ ~~ 问题答案: 如您所述,它可以使用以下语法: 但是,如果我们声明一个: 因此,我想说这是一个错误,也应该无需输入别名即可工作。 更新 :Apple 已经
问题内容: 在Java的for-each循环中使用泛型时,出现一个奇怪的编译器错误。这是Java编译器错误,还是我真的在这里遗漏了什么? 这是我全班的: 编译器抱怨for-each所在的行:“类型不匹配无法从元素类型Object转换为String。” 如果我进行了微妙的更改,它将编译为: 我知道确实使用泛型,但是我以完全不相关的方式使用它们。如果我尝试遍历T类型的某些内容并返回a 或某种内容,我可
我在这里遇到了一个关于带列表的泛型有界类型的小问题。请帮帮我! 有什么方法可以克服这个问题,或者我可以安全地压制警告吗?
我正在尝试编写一个列出目录中所有非隐藏文件的方法。但是,当我添加条件 我的代码无法编译,编译器返回以下错误: 我试图捕捉< code>IOException,但是编译器仍然拒绝编译我的代码。我遗漏了什么明显的东西吗?代码如下所示。
问题内容: 我下面这个线程,这一个建立自己的KDE没有须藤权限。由于没有在工作站上安装Git和CMake。我只是将它们都安装在 / home / <用户>下,并将 / home / <用户> / bin和 / home / <用户> / lib添加 到PATH和LD_LIBRARY_PATH中。由于KDE构建仅支持CMake,因此不进行配置。因此,我必须通过CMake设置前缀,如下所示:。在这一点