【发布时间】:2009-10-09 01:33:25
【问题描述】:
Java 泛型系统中的一些极端情况仍然存在问题。
我有这个方法(我只对签名感兴趣):
interface Extractor<RETURN_TYPE> {
public <U extends Enum<U>> RETURN_TYPE extractEnum(final Class<U> enumType);
}
(想想一个接口,它的实现有时会提取一个 EnumSet 有时一个实现会提取一个 JComboBox 等)
我想用在运行时获得的类来调用它,所以我只是这样称呼它:
public static <RETURN_TYPE> RETURN_TYPE extractField(final Extractor<RETURN_TYPE> extractor, final Field field) {
final Class<?> type = field.getType();
if (type.isEnum())
return extractor.extractEnum(/* error here*/type.asSubclass(Enum.class));
throw new RuntimeException("the rest of the visitor is not necessary here");
}
我收到一条奇怪的错误消息: 不兼容的类型 找到:java.lang.Object 必需:RETURN_TYPE
消息的位置,如果就在调用的开始括号之后,在类型的“t”之前。
如果我从非通用上下文中调用它,它可以工作:
Integer extractField(final Extractor<Integer> extractor, final Field field) {
final Class<?> type = field.getType();
if (type.isEnum())
return extractor.extractEnum(type.asSubclass(Enum.class));
throw new RuntimeException("the rest of the visitor is not necessary here");
}
请问有人对此问题有解释和解决方案吗?
这是一个完整的文件,供想要玩它的人使用:
public class Blah {
interface Extractor<RETURN_TYPE> {
public <U extends Enum<U>> RETURN_TYPE extractEnum(final Class<U> enumType);
}
public static <RETURN_TYPE> RETURN_TYPE extractField(final Extractor<RETURN_TYPE> extractor, final Field field) {
final Class<?> type = field.getType();
if (type.isEnum())
return extractor.extractEnum(/* error here*/type.asSubclass(Enum.class));
throw new RuntimeException("the rest of the visitor is not necessary here");
}
public static Integer extractField(final Extractor<Integer> extractor, final Field field) {
final Class<?> type = field.getType();
if (type.isEnum())
return extractor.extractEnum(type.asSubclass(Enum.class));
throw new RuntimeException("the rest of the visitor is not necessary here");
}
}
提前致谢,
妮可
【问题讨论】:
-
你的问题让我想起了一部老花生漫画。莱纳斯:“我觉得我的舌头不行了!我想说 brlalalala 但它总是说出来 brzazazaa!”露西:“我认为你的整个大脑都在工作。”
-
我不得不说......没有可编译的玩具示例(没有毫无意义的抽象),很难理解这个问题。
-
Jonathan > 重点是它不能编译。我将添加一个完整的课程。
-
你暗示它不编译,但它为我编译(带有未经检查的警告)。
-
有意思,请问你用的是什么JDK?对我来说,Intellij 没有放任何红色,但编译器给了我一个错误。我在 mac os x (32bits) 上使用 java 1.6.0_15