2017-07-26 79 views
0

这是我的代码。我有一个基本接口来定义通用功能。用泛型实现接口,两种方法都有相同的擦除

interface BaseInterface<T> { 
     void baseFunc(T param) 
    } 

    interface MyInterface1 extends BaseInterface<MyEntity1> { 
     void func1() 
    } 

    interface MyInterface2 extends BaseInterface<MyEntity2> { 
     void func2() 
    } 

而且我的课是:

abstract class BaseClass implements BaseInterface<T> { 
     // ...some common things 
    } 

    class ClassA extends BaseClass implements MyInterface1 { 
     @Override 
     public void func1() {...} 

     @Override 
     public void baseFunc(MyEntity1 param) {...} 
    } 

    class ClassB extends BaseClass implements MyInterface2 { 
     @Override 
     public void func2() {...} 

     @Override 
     public void baseFunc(MyEntity2 param) {...} 
    } 

不同课做做不同的豆MyEntity1和MyEntity2同样的事情。所以我用generic T定义了baseFunc()。

但是这里有个问题。 “这两种方法都有相同的擦除,但都不会覆盖其他baseFunc(T)和baseFunc(MyEntity1)...”

如何解决此问题?

顺便说一下,当我删除泛型并将baseFunc移动到MyInterface1和MyInterface2时,它工作正常。但我认为这不是最好的方法。

+2

'抽象类BaseClass实现BaseInterface '出错了。什么是'T'? – shmosel

+0

对,我检查了我的代码,发现了这个。抽象类BaseClass的实现BaseInterface 改变抽象类BaseClass的实现BaseInterface 类ClassA的扩展BaseClass的类ClassB的扩展BaseClass的

+0

@OscarZhang对不起,我输入我的回答之前,我注意到你的评论。这对你有用吗?如果是这样,你可以将你的评论转换为答案,在这种情况下,我会删除我的;因为你的评论和我的回答基本上是一样的。 –

回答

5

声明

abstract class BaseClass implements BaseInterface<T> 

是没有意义的,除非T是一个实际的类。如果它实现一个通用接口,它需要要么

  • 是一个通用类,
  • 到位泛型类型参数的提供一个类型参数。

我相信你真正想要写是

abstract class BaseClass<T> implements BaseInterface<T> 

保持BaseClass作为一个泛型类。然后,您可以申报其他类如

class ClassA extends BaseClass<MyEntity1> implements MyInterface1 

class ClassB extends BaseClass<MyEntity2> implements MyInterface2 

然后就没有传递给baseFunc方法类型的冲突。

+0

是的,这是有效的。非常感谢〜 –

相关问题