抽象类上参数化方法的奇怪行为
有人能告诉我为什么这会出现编译错误吗?我不明白为什么在第二个 for 循环中转换为 A 会导致 strings() 返回一般对象列表。
import java.util.ArrayList;
import java.util.List;
public class E {
public static void main(String[] args) {
for (String s : new D().strings()) {
System.out.println("s = " + s);
}
for (String s : ((A) new D()).strings()) {
System.out.println("s = " + s);
}
}
static class D extends A<C> {
}
static abstract class A<T extends B> {
List<String> strings() {
return new ArrayList<String>() {{
add("Foo");
add("Bar!");
}};
}
}
static class B {
}
static class C extends B {
}
}
这是泛型的怪癖吗?
谢谢,克里斯蒂安
Can someone tell my why this gives a compile error? I don't see why the cast to A in the second for-loop causes strings() to return a general List of Objects.
import java.util.ArrayList;
import java.util.List;
public class E {
public static void main(String[] args) {
for (String s : new D().strings()) {
System.out.println("s = " + s);
}
for (String s : ((A) new D()).strings()) {
System.out.println("s = " + s);
}
}
static class D extends A<C> {
}
static abstract class A<T extends B> {
List<String> strings() {
return new ArrayList<String>() {{
add("Foo");
add("Bar!");
}};
}
}
static class B {
}
static class C extends B {
}
}
Is this a Generics quirk?
Thanks, Kristian
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在该行中:
您正在转换为原始类型
A
,因此您会丢失其中的类型参数信息。在 Java 中,任何使用原始类型的方法或字段也会产生原始类型(即使所有参数化信息都可用)——从技术上来说,原始类型或非参数化类型。因此,A.string()
被视为原始类型List
,而不是List
。正如 JSL 在第 4.8 节中指定的那样:
In the line:
You are casting to the raw type
A
, so you lose the type arguments information there. In Java, any use method or field on a raw type would also result in a raw type (even if all the parameterized information is available) -- well raw type or non-parameterized technically. SoA.string()
is viewed as the raw typeList
rather thanList<String>
.As the JSL specifies in Section 4.8: