【发布时间】:2019-04-16 08:35:37
【问题描述】:
我有以下使用 本地类的 Java 代码。
import java.util.Arrays;
public class X<T> {
void m() {
class Z {}
for (Object o : Arrays.asList(1, 2, 3))
if (o instanceof Z) {}
}
}
它没有编译并出现以下错误消息:
X.java:8: error: illegal generic type for instanceof
if (o instanceof Z) {}
^
1 error
我知道本地类Z 继承了X<T> 的泛型类型签名,是一个内部类。这个例子中出现了同样的编译错误,其中Z不是本地的,而是内部的:
import java.util.Arrays;
public class X<T> {
class Z {}
void m() {
for (Object o : Arrays.asList(1, 2, 3))
if (o instanceof Z) {} // Compilation error
}
}
可以通过将Z 设为非内部/静态来解决:
import java.util.Arrays;
public class X<T> {
static class Z {}
void m() {
for (Object o : Arrays.asList(1, 2, 3))
if (o instanceof Z) {} // Compiles now
}
}
import java.util.Arrays;
public class X<T> {
class Z {}
void m() {
for (Object o : Arrays.asList(1, 2, 3)) {
if (o instanceof X.Z) {} // Compiles now
if (o instanceof X<?>.Z) {} // Also
}
}
}
但是我怎样才能在不改变本地类本身的情况下限定本地类,或者解决这个限制呢?
【问题讨论】:
-
我认为这是一种编译器病态。这是告诉您类型不可具体化的一种奇怪方式。在 Eclipse 中情况更糟——它告诉你“使用 Z 形式”。
-
@RealSkeptic:Eclipse 的编译器消息在这里只是“不走运”。这通常是有用的额外信息。
-
由此推论
Z[] array = new Z[0];也是非法的。
标签: java generics local-class