还有其他一些SO问题正在讨论使用Eclipse编译器编译OK的泛型,而不是javac(即Java: Generics handled differenlty in Eclipse and javac和Generics compiles and runs in Eclipse, but doesn't compile in javac) - 但这看起来有点不同。
我有一个enum
课程:
public class LogEvent {
public enum Type {
// ... values here ...
}
...
}
我有另一个类,其方法可以接收来自Enum
的任意类型的对象:
@Override public <E extends Enum<E>> void postEvent(
Context context, E code, Object additionalData)
{
if (code instanceof LogEvent.Type)
{
LogEvent.Type scode = (LogEvent.Type)code;
...
这在Eclipse中运行良好,但是当我使用ant
进行清理时,我遇到了一对错误,一个在instanceof
行,另一个在转换行上:
443: inconvertible types
[javac] found : E
[javac] required: mypackage.LogEvent.Type
[javac] if (code instanceof LogEvent.Type)
[javac] ^
445: inconvertible types
[javac] found : E
[javac] required: com.dekaresearch.tools.espdf.LogEvent.Type
[javac] LogEvent.Type scode = (LogEvent.Type)code;
[javac] ^
为什么会发生这种情况,如何解决这个问题以便正确编译?
答案 0 :(得分:32)
我不知道为什么会这样,但解决方法很简单:
@Override public <E extends Enum<E>> void postEvent(
Context context, E code, Object additionalData)
{
Object tmp = code;
if (tmp instanceof LogEvent.Type)
{
LogEvent.Type scode = (LogEvent.Type)tmp;
...
这很难看,但它有效......
答案 1 :(得分:8)
也许是因为你宣称E是扩展Enum&lt; E&gt;的东西。我不能说我完全理解它,但看起来它将类型集限制为某些子集,由于某种原因不能包含LogEvent.Type。或许它只是编译器中的一个错误。如果有人能够更清楚地解释它,我会很高兴,但这是你可以做的:
public <E extends Enum<?>> void postEvent(E code)
{
if (code instanceof LogEvent.Type)
{
LogEvent.Type scode = (LogEvent.Type)code;
...
}
...
这很有效,它比仅仅转换为Object更优雅。
答案 2 :(得分:4)
我遇到了类似的问题,并从jdk1.6.0_16升级到jdk1.6.0_23,它没有任何代码更改就消失了。
答案 3 :(得分:0)
为了使用instanceof
,两个操作数都必须继承/实现相同的类/接口
E只是无法强制转换为LogEvent.Type
我不知道你的完整方法是什么样的,但这应该通过使用接口而不是泛型来解决你的问题。
public interface EventType { }
public class LogEvent {
public enum Type implements EventType {}
}
public void postEvent(Context context, EventType code, Object additionalData) {
if(code instanceof LogEvent.Type) {
}
}