javac错误:带有generics的不可转换的类型?

还有其他几个SO问题正在讨论generics编译OK / Eclipse的编译器而不是javac(即Java:Generics在Eclipse中处理差异,javac和Generics编译并在Eclipse中运行,但不在javac中编译 ) – 但这看起来很像就像一个略有不同的人。

我有一个enum类:

 public class LogEvent { public enum Type { // ... values here ... } ... } 

我有另一个类,其方法接受来自Enum任意类型的对象:

 @Override public <E extends Enum> 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] ^ 

为什么会发生这种情况,如何解决这个问题以便正确编译?

我不知道为什么会这样,但解决方法很简单:

 @Override public > void postEvent( Context context, E code, Object additionalData) { Object tmp = code; if (tmp instanceof LogEvent.Type) { LogEvent.Type scode = (LogEvent.Type)tmp; ... 

这很难看,但它有效……

也许是因为你宣称E是扩展Enum 的东西。 我不能说我完全理解它,但看起来它将类型集限制为某些子集,由于某种原因不能包含LogEvent.Type。 或者它可能只是编译器中的一个错误。 如果有人能够更清楚地解释它,我会很高兴,但这是你可以做的:

 public > void postEvent(E code) { if (code instanceof LogEvent.Type) { LogEvent.Type scode = (LogEvent.Type)code; ... } ... 

这很有效,它比仅仅转换为Object更优雅。

我遇到了类似的问题,并从jdk1.6.0_16升级到jdk1.6.0_23,它没有任何代码更改就消失了。

为了使用instanceof两个操作数必须inheritance/实现相同的类/接口。
E只是无法强制转换为LogEvent.Type

我不知道你的完整方法是什么样的,但这应该通过使用接口而不是generics来解决你的问题。

 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) { } }