Java泛型类型限制

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

类 All
+-- 类 A 扩展自 All
+-- 类 B 扩展自 All

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

在每个“contain”类中都有一个链表和一个方法。

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);
    }
}

但这个例子并不起作用,我已经尝试过了。感谢阅读。

2
什么没有起作用?你得到了什么错误或者看到了什么行为? - LuigiEdlCarno
类型ContainB<T>的方法addElement(T)必须覆盖或实现一个超类型。 - BadJoke
糟糕,问题已经解决:在ContainB后面写了“implements”而不是“extends”我真丢脸。 - BadJoke
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);
    }
}

然后将ContainA实现为ContainAll<A>等。 .addElement()会自动工作。

0

你需要添加

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

回到你的ContainAll类。


0
这里有一个解决方案:

//ClassA

package limitgeneric;

public class A {

}

//类B

package limitgeneric;

public class B {

}

//类 ContainAll

package limitgeneric;

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

//类 ContainA

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>();
      }
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接