【问题标题】:Inheritance with generics java使用泛型继承 java
【发布时间】:2012-10-29 05:32:17
【问题描述】:

我的子类有问题并试图使我的函数“方法”通用,请参见下文,我在实现类 C1 和 C2 以分别使用 B1 和 B2 类型的对象时遇到问题。

编辑:对不起,如果不清楚,基本上我正在尝试覆盖函数方法,但我需要参数是通用的,所以对于作为 C 的子类的类 C1,它应该使用 B1 作为参数和对于 C1 的子类 C2,它应该使用 B2 作为参数。

我希望实现的行为的代码,但我正在努力使其编译。

这是我的课程

class A{}
class T1{}
class V1{}
abstract class B<T extends T1, V extends V1>{}
class B1 extends B<SomeChildOfT1, SomeChildOfV1>{}
class B2 extends B1{}

abstract class C <E extends B<? extends T1, ? extends T2>> extends A
{
    void method(E)
      {//bla}
}

class C1<E extends B1> extends C<B1>
{
   //method with object B1 as parameter
   @override
   void method(E){
    //bla
    } 
}

class C2 extends C2<B2>
{
    @override
  void method(B2)
  {

  }
}

【问题讨论】:

  • 您的解决方案有什么问题?调用堆栈,错误消息?
  • 您的问题可以更好地提出。充其量,这段代码甚至无法编译。
  • 至少提及你想要达到的目标总是好的。
  • 我不能使用 B2 类型的对象作为我在 C2 类中重写的方法的参数。它使用 B1 作为参数,这不是我需要的,因为我在方法中使用了 B2 类型的对象。
  • abstract class B&lt;T extends T1, V extends V1&gt;{} 中的T1V1 是什么?可以只是abstract class B&lt;T, V&gt;{}吗?

标签: java generics inheritance overriding


【解决方案1】:

你有什么理由不能让C1&lt; E &gt; 扩展C&lt; E &gt;?以下为我编译,对您的示例进行了适当的编辑:

class A{}
class T1{}
class SomeChildOfT1 extends T1 {}
class V1{}
class SomeChildOfV1 extends V1 {}
abstract class B<T extends T1, V extends V1>{}
class B1 extends B<SomeChildOfT1, SomeChildOfV1>{}
class B2 extends B1{}

abstract class C <E extends B<? extends T1, ? extends V1>> extends A {
    void method(E e) {}
}

class C1<E extends B1> extends C<E> {
    @Override void method(E e) {}
}

class C2 extends C1<B2> {
    @Override void method(B2 b2) {}
}

【讨论】:

    【解决方案2】:

    虽然有点乱,但我认为你应该这样做:

    class A{}
    class T1{}
    class V1{}
    abstract class B<T extends T1, V extends V1>{}
    class B1 extends B<SomeChildOfT1, SomeChildOfV1>{}
    class B2 extends B1{}
    
    abstract class C <T extends T1, V extends V1, E extends B<T, V>> extends A
    {
        void method(E)
          {//bla}
    }
    
    class C1<E extends B1> extends C<SomeChildOfT1, SomeChildOfV1, E>
    {
       //method with object B1 as parameter
       @override
       void method(E){
        //bla
        } 
    }
    
    class C2 extends C1<B2>
    {
        @override
      void method(B2)
      {
    
      }
    }
    

    【讨论】:

    • 试过了,结果和我一样。为 C1 生成覆盖方法时,该参数设置为 B1。那么当你为 C2 生成覆盖时,它使用 B1 作为参数而不是 B2(这是我想要实现的)
    • 对 C1 的声明进行了一些更改。我不确定它是否有效,但前一个显然不正确
    • 已经在 ideone 中尝试过,我建议的方式可以编译。您可以查看 ideone.com/XK07j7 。老实说,我认为您的示例过于复杂...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 2021-10-11
    • 2011-04-25
    相关资源
    最近更新 更多