2011-01-28 21 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,它沒有任何代碼更改就消失了。