2014-02-19 139 views
1

我想要實現從Apache的共享BeanUtils的以下接口:爲什麼這個@Override不正確?

public interface Converter { 
    // Convert the specified input object into an output object of the specified type 
    <T> T convert(java.lang.Class<T> tClass, java.lang.Object o); 
} 

我實施應採取枚舉的子類,String對象轉換爲指定類型的枚舉。我試圖使用以下聲明:

class EnumConverter implements Converter { 
    @Override 
    public Enum convert(Class<Enum> tClass, Object o) { 
     ... 
    } 
} 

但編譯器不同意我。它輸出:

error: EnumConverter is not abstract and does not override abstract method convert(Class,Object) in Converter

error: name clash: convert(Class,Object) in EnumConverter and convert(Class,Object) in Converter have the same erasure, yet neither overrides the other

error: method does not override or implement a method from a supertype

我的實現有什麼問題?

UPD。請仔細閱讀該問題。我無法更改它在Apache Commons BeanUtils庫中的Converter接口。

+0

你需要讓你的接口一般爲好。 –

+0

@DaveNewton「我想從Apache Commons BeanUtils實現以下接口」。它是我無法更改的第三方庫。 –

回答

3

你在EnumConverterconvert方法不是一般的像Converterconvert方法是通用的。如果實現的方法定義了它自己的類型參數,那麼重寫方法也必須這樣做。

但是,看起來您需要泛型類型參數爲Enum。如果是這樣,那麼接口Converter必須是通用的,而不是方法。 convert方法將引用它的接口的泛型類型參數,而不是定義它自己的。

interface Converter<T> { 
    // Convert the specified input object into an output object of the specified type 
    T convert(java.lang.Class<T> tClass, java.lang.Object o); 
} 

然後,您可以在實現接口時指定Enum

class EnumConverter implements Converter<Enum>{ 
    @Override 
    public Enum convert(Class<Enum> tClass, Object o) { 
     ... 
    } 
} 

如果你不能改變的接口,那麼你就必須實施用相同的泛型方法泛型方法。您不能添加任何邊界,例如<T extends Enum<T>>

class EnumConverter implements Converter{ 
    @Override 
    public <T> T convert(Class<T> tClass, Object o) { 
     ... 
    } 
} 

如果你想讓它僅枚舉工作,那麼你就必須在運行時執行它:

if (!Enum.class.isAssignableFrom(tClass)) 
    throw new IllegalArgumentException("Class must specify an Enum!"); 
+0

您能否爲我的情況編寫正確的類定義(不需要更改Converter界面)? –

+0

我無法更改Converter界面。 –

+0

太好了。感謝您的詳細解答。 –

相關問題