2013-01-22 58 views
1

以下代碼在JDK6中編譯。編譯錯誤在JDK7中失敗。javac:所需的不兼容類型:classname <TYPEPARAM> found:classname <java.lang.Object>

java: incompatible types 
    required: com.jdk7.IExporter<O> 
    found: com.jdk7.IExporter<java.lang.Object> 

編譯器是1.7.0_10,來自Oracle。

$ javac -version 
javac 1.7.0_10 

代碼

package com.jdk7; 

public class GenericIn7 { 

    public <O> IExporter<O> getExporter(Class<O> objType) { 
     final IExporter<O> localExporter = 
       determineExporter(getPersistentInterface(objType)); 
     return null; 
    } 

    private <O> IExporter<O> determineExporter(Class<O> persistentInterface) { 
     return null; 
    } 

    protected <O, I extends O> Class<O> getPersistentInterface(Class<I> clazz) { 

     return null; 
    } 
} 

class IExporter<T> { 
} 

[爲了完整起見, 與IExporter等變化更換通用讓它編譯。 ]

+0

這兩個都使用普通的javac?即,沒有ecj或任何東西? – fge

+1

針對不兼容的Java錯誤修復http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#jdk7 – user1983527

+1

@ user1983527:感謝您的幫助。我在發佈這個問題時檢查過。無法真正將錯誤與其中的任何內容連接起來。 – Jayan

回答

3

貌似類型推斷就像你希望在此行不工作:

final IExporter<O> localExporter = 
      determineExporter(getPersistentInterface(objType)); 

我認爲這個問題是什麼O被解析爲getPersistentInterface()。它被稱爲,如果你打電話給this.<Object, O>getPersistentInterface(...)。如果你是明確的:

final IExporter<O> localExporter = 
      determineExporter(this.<O, O>getPersistentInterface(objType)); 

它工作正常。

+0

@ Mark Peters:謝謝。這個錯誤? IntelliJ在編輯時不顯示任何警告。 – Jayan

+1

@Jayan:我不確定這是否是一個錯誤。在推斷泛型參數時發現IntelliJ和javac不同意並不罕見。我發現JLS周圍的泛型細微差別很難解析,所以我不打算將它應用於這種情況:-)。一個測試可能是使用ecj來嘗試它,看看你是否得到相同的結果。 Java從來沒有在類型推理方面很出色。當提示來自賦值時,它很好用,在簡單表達式中可以,當提示來自另一個泛型方法的參數類型時,效果不好。 –

+0

@ Mark Peters:謝謝。很高興能更多地瞭解這一點。 – Jayan

相關問題