2011-01-28 58 views
23

还有几个其他的SO问题讨论泛型编译好,但是使用Eclipse的编译器而不是javac(即Java: Generics handled differenlty in Eclipse and javacGenerics compiles and runs in Eclipse, but doesn't compile in javac) - 但是这看起来有点不同。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]            ^

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

回答

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; 
    ... 

这是丑陋的,但它的作品...

+0

谢谢。为什么那么丑陋?它很简单,运行成本低。 – 2011-01-28 16:07:20

+3

@Jason S:这很丑,因为我看不出为什么这是必需的。 – 2011-01-28 16:10:40

+0

这是一个已知的错误,IIRC。实际上,有几十个相关的错误,但都没有修正。 – maaartinus 2011-01-31 11:06:11

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

也许是因为你已经声明è的东西扩展Enum <ê>。我不能说我完全理解它,但它看起来像限制了一些类型的集合,因为某些原因,它们不能包含LogEvent.Type。或者,这可能只是编译器中的一个错误。我会很高兴,如果有人能更清楚地解释它,但这里是你可以做什么:

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

这工作,它不仅仅是铸造到对象更优雅。

4

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