我有以下使用本地类的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
}
}
或由qualifying X.Z
提供
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
}
}
}
但是,如何才能在不更改本地类本身的情况下限定本地类或解决此限制呢?
发布于 2019-04-16 16:57:14
发布于 2019-04-16 16:35:38
一种可能的解决方法是使用反射:
import java.util.Arrays;
public class X<T> {
void m() {
class Z {}
for (Object o : Arrays.asList(1, 2, 3))
if (Z.class.isInstance(o)) {}
}
}
发布于 2019-04-16 16:42:40
显然,通过使Z泛型编译成功。我本以为需要<T>
作为类型参数,但您只需将其泛型,所以任何东西都可以
import java.util.Arrays;
public class X<T> {
void m() {
class Z<Anything> {}
for (Object o : Arrays.asList(1, 2, 3))
if (Z.class.isInstance(o)) {}
}
}
正确的解决方案是限定本地类,但我不认为您可以这样做。要么将其重构为私有静态类,要么这可能是您能得到的最好的。
https://stackoverflow.com/questions/55703849
复制相似问题