2016-07-06 112 views
5

所以我有一個類:無法實例與普通類類型

public class DynQSimModule<T extends Mobsim> extends AbstractModule 
{ 

    private Class<? extends javax.inject.Provider<? extends T>> providerClass; 

    public DynQSimModule(Class<? extends javax.inject.Provider<? extends T>> providerClass) 
    { 
    this.providerClass = providerClass; 
    } 

    //some methods down here 
} 

,當我嘗試打電話:

controler.addOverridingModule(new DynQSimModule<>(AMoDQSimProvider.class)); 

Eclipse的告訴我,它「不能推斷類型參數DynQSimModule <> 。我明白這是因爲我沒有把任何東西放在<>中,但是我構建的示例代碼使用相同的確切語法並且運行得非常好......

Whe ñ我把這樣的:

controler.addOverridingModule(new DynQSimModule<? extends Mobsim(AMoDQSimProvider.class)); 

Eclipse的告訴我:「不能實例類型DynQSimModule」

我知道,當你試圖實例化一個接口或抽象類,但DynQSimModule這是一個問題是不是那些...

任何幫助將是偉大的。

謝謝!

+1

使用鑽石算子很好。我用eclipse mars遇到過這個錯誤信息,真正的原因實際上是缺少導入。確保你沒有任何錯誤,例如缺少AMoDQSSimProvider導入或奇怪類名中的拼寫錯誤等。 –

+0

什麼是您的jdk版本? –

+0

我剛剛安裝了最新版本的JDK,並得到這個從我的終端: 「Java版本 「1.8.0_91」 的Java(TM)SE運行時環境(建立1.8.0_91-B14) 的HotSpot的Java(TM)64位服務器VM(建25.91〜B14,混合模式)」 我仍然雖然具有‘不能推斷類型’的問題... –

回答

2

我想你正在使用JDK 7.如果是這種情況new DynQSimModule<>(AMoDQSimProvider.class)將不會編譯,因爲Java 7不使用目標類型來推斷傳遞參數的類型。

new DynQSimModule<? extends Mobsim>(AMoDQSimProvider.class)也不會編譯,因爲你的不能在對象創建中使用通配符表示法。

要解決此問題,您必須提供new DynQSimModule<>(...)中的確切類型,或者如果可能的話,您可以升級到提供目標類型推斷功能的Java 8。

例如下面的代碼不會在Java 7的編譯,但將用Java編譯8+:

public static void test(List<String> list) { 
    // some code 
} 

public static void main(String[] args) { 
    test(new ArrayList<>()); // will not compile in Java 7 but it is legal in Java 8+ 
} 

更多關於Java 8 Target Type Inference

+0

我確實在我的終端Java的版本,並得到: Java版本「1.8.0_65 「 Java™SE運行時環境(內部版本1.8.0_65-b17) Java HotSpot™64位服務器虛擬機(版本25.65-b01,混合模式) 我假設我必須安裝JDK而不是JRE ? –

+0

您可以使用'javac -version'來檢查您的JDK版本。如果是JDK 7那麼是的,你需要安裝JDK 8. –

+0

它說'javac 1.8.0_91',這是否意味着我正在運行JDK 8? –