2013-05-26 111 views
3

我正在編寫一些代碼並遇到了編譯錯誤incompatible types。 這是我有:另一個Java泛型「不兼容類型」編譯錯誤

public interface Expression<T> { 
    int getArity(); 
    T evaluate(); 
} 

public abstract class Value<T> implements Expression<T> { 
    @Override 
    public final int getArity() { return 0; } 
} 

public final class Constant<T> extends Value<T> { 
    private final T value; 

    /** Parameter constructor of objects of class Constant. */ 
    public Constant(T val) { 
     value = val; 
    } 

    /** Copy constructor of objects of class Constant. */ 
    private Constant(Constant instance) { 
     value = instance.evaluate(); // Error here. 
    } 

    @Override 
    public T evaluate() { return value; } 
} 

我想用繼承的時候我沒有正確申報仿製藥,所以我檢查Oracle's tutorial,他們在寫

interface PayloadList<E,P> extends List<E> 

上面的de claration使用相同的泛型E,這是我想要在我的例子中完成的。它似乎假定Constant<T>TValue<T>T不同。否則它應該能夠合併T並看到它是相同的類型。 我怎樣才能正確實現我想要實現的目標?

即,一個東西是不變的東西價值,這是同樣的東西表達式)

+7

你想'私人恆(恆實例)我懷疑{'代替... –

+0

^^'Constant'!='Constant ' - 當你不指定通用時,它將會是'Constant ' –

+0

我當然相信,它一定是小東西逃離我的眼睛。我試了一下,現在用'不安全的操作'警告來編譯。 – afsantos

回答

12

instance變量定義爲Constant instance;

如果不指定您的變量的泛型,泛型將自動爲Object,而ObjectT不同。

你必須使用

private Constant(Constant<T> instance) 

,而不是

private Constant(Constant instance) 

,因爲這將是一樣的private Constant(Constant<Object> instance)