2016-04-27 83 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

相关问题