3

在Java中,我有以下类结构:

所有类
+-- A 类扩展所有
+-- B 类扩展所有

类 ContainAll
+-- 类 ContainA 扩展 ContainAll
+-- 类 ContainB 扩展 ContainAll

在每个“包含”类中都有一个链表和一个方法

public addElement(All a) {
    list.add(a)
}

ContainAll 类不应被实例化,但 ContainA 和 ContainB 类可以。
我如何通过泛型明确说明 ContainB 类中的 addElement 只能从 B 类型获取对象,例如:

public abstract class ContainAll<T extends All> {}

public class ContainB<T extends B> extends ContainAll<All> {
    public addElement(T b) {
        list.add(b);
    }
}

但是这个例子不起作用,我试过了。谢谢阅读。

4

3 回答 3

4

使您的ContainAll类抽象(因为您的要求之一是不能实例化它)并使其实现.addElement()

public abstract class ContainAll<T extends All>
{
    private final List<T> list = new LinkedList<T>();

    // ...

    // FINAL! Subclasses cannot override it
    public final void addElement(final T element)
    {
        list.add(element);
    }
}

然后实现ContainAContainAll<A>.addElement()将“自动”工作。

于 2013-06-14T10:55:03.870 回答
0

您需要添加

public addElement(T b) {
    list.add(b);
}

到你的ContainAll班级。

于 2013-06-14T10:53:52.200 回答
0

这是一个解决方案:

//A类

package limitgeneric;

public class A {

}

//B类

package limitgeneric;

public class B {

}

//类包含所有

package limitgeneric;

public abstract class ContainAll<T> {
     public abstract void addElement(T t);
}

//类包含A

package limitgeneric;

import java.util.ArrayList;
import java.util.List;

public class ContainA<T extends A> extends ContainAll<T> {
     List<T> locallist = new ArrayList<T>();
     public void addElement(T t) {
          locallist.add(t);
     }
}

//类包含B

  package limitgeneric;

  import java.util.ArrayList;
  import java.util.List;

  public class ContainB<T extends B> extends ContainAll<T> {
    List<T> locallist = new ArrayList<T>();
    public void addElement(T t) {
        locallist.add(t);
    }
  }

//主类

  package limitgeneric;

  public class Main {
      public static void main(String[] args) {
          ContainA<A> a = new ContainA<A>();
          //a.addElement(new B());
          a.addElement(new A());
          //ContainA<B> b = new ContainA<B>();
      }
  }
于 2013-06-14T10:58:54.467 回答