2016-04-27 57 views
1

我有這兩個接口:使用泛型從子接口覆蓋接口方法的正確方法是什麼?

public interface ApiResultCallback { 
    void onSuccess(RestApi.Success<?> successResult); 
    void onFailure(RestApi.Failure failureResult); 
} 

public interface GetHappyCowsCallback extends ApiResultCallback { 
    void onSuccess(RestApi.Success<List<HappyCow>> successResult); 
} 

SuccessFailure是:

public static class Success<T> extends ApiResult { 
    public T data; 
} 

public static class Failure extends ApiResult { 
    public String message; 
} 

我得到GetCleverPointsCallback接口一個錯誤,指出

兩種方法都有相同的擦除但也覆蓋另一個。

這是什麼意思? GetHappyCowsCallback的方法不應該重寫其父項的方法嗎?

我試圖在這裏實現某種回調和他們的數據之間的映射,而無需執行長映射函數或者更糟的是,複製成功類是這樣的:

public static abstract class Success<T> extends ApiResult { 
    public T data; 
} 

public static class ListHappyCowSuccess extends Success<List<HappyCow>> { 
} 
+0

從[這裏](http://stackoverflow.com/questions/17116845/implementing-comparable-compareto-name-clash-have-the-same-erasure-yet-neith ):「這些方法具有相同的擦除,這意味着一旦編譯器去除了泛型類型信息,就不再有在運行時區分它們的方法。」 – Frecklefoot

+0

@Frecklefoot好吧,這是有道理的,但這部分是什麼:「但是都沒有壓倒另一個」?第二種方法不應該覆蓋第一種方法嗎? – TheCrafter

+0

我不確定,因爲Java現在不是我的專長,但[Google搜索](https://www.google.com/search?q=java+error+both+methods+have+same+擦除+但+不+ +覆蓋+ +其他。&ie = utf-8&oe = utf-8)的錯誤產生了幾十個好結果。我希望有所幫助。 – Frecklefoot

回答

2
void onSuccess(RestApi.Success<?> successResult); 

並且

void onSuccess(RestApi.Success<List<HappyCow>> successResult); 

沒有相同的簽名。因此,第二個不會覆蓋第一


你正在試圖做的可以通過使通用的接口來實現什麼:

public interface ApiResultCallback<T> { 
    void onSuccess(RestApi.Success<T> successResult); 
    void onFailure(RestApi.Failure failureResult); 
} 

public interface GetHappyCowsCallback extends ApiResultCallback<List<HappyCow>> { 
} 

事實上,你可能並不需要第二個界面在所有。這種僞類型定義甚至被認爲是反模式,因爲新類型不能與它們的等價物交換。

如果我有這樣的方法:

void myMethod(GetHappyCowsCallback callback); 

我不能傳遞一個ApiResultCallback<List<HappyCow>>給它。


在大多數情況下,接口覆蓋並沒有什麼意義。除非它涉及default方法:

interface InterfaceA { 
    public void doSomething(); 
} 

interface InterfaceB extends InterfaceA { 
    @Override 
    public default void doSomething() {...} // Provides a default implementation 
} 
+0

嗯,是的,這是有效的。說實話,我甚至沒有想過這麼簡單......我認爲答案是深入到泛型文檔的某個地方。謝謝! – TheCrafter