【问题标题】:Implements interface with generics, both methods have same erasure使用泛型实现接口,两种方法具有相同的擦除
【发布时间】:2018-01-01 04:03:50
【问题描述】:

这是我的代码。我有一个基本接口来定义通用功能。

    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) {...}
    }

不同的类对不同的 bean MyEntity1 和 MyEntity2 做同样的事情。所以我用泛型 T 定义了 baseFunc()。

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

如何解决这个问题?

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

【问题讨论】:

  • abstract class BaseClass implements BaseInterface&lt;T&gt; 有问题。 T 是什么?
  • 对,我查看了我的代码并找到了这个。抽象类 BaseClass 实现 BaseInterface 更改为抽象类 BaseClass 实现 BaseInterface 类 ClassA 扩展 BaseClass 类 ClassB 扩展 BaseClass
  • @OscarZhang 抱歉,我在注意到您的评论之前输入了答案。这对你有用吗?如果是这样,您可以将您的评论转换为答案,在这种情况下,我将删除我的;因为您的评论和我的回答基本相同。
  • @DawoodibnKareem 哈哈,没关系。你的答案是解决方案。保留它,它对遇到相同问题的其他人来说更明显。

标签: java android generics inheritance interface


【解决方案1】:

声明

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 方法的类型就不会发生冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多