[英]Java Generics limit type
In Java i have the following Class Structure: 在Java中,我有以下类结构:
class All 全部
+-- class A extends All + - A类扩展全部
+-- class B extends All + - B级扩展All
class ContainAll class ContainAll
+-- class ContainA extends ContainAll + - 类ContainA扩展ContainAll
+-- class ContainB extends ContainAll + - 类ContainB扩展ContainAll
In every "contain" class there is a linked list, and a Method 在每个“包含”类中都有一个链表和一个方法
public addElement(All a) {
list.add(a)
}
The class ContainAll should not be instanced, but the class ContainA and ContainB can. ContainAll类不应该是实例化的,但是ContainA和ContainB类可以。
How do i make clear, with generics, that addElement in class ContainB can only get Objects from type B, so for Example: 我如何使用泛型清楚地表明,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);
}
}
But this example does not work, i tried it. 但这个例子不起作用,我试了一下。 Thanks for reading. 谢谢阅读。
Make your ContainAll
class abstract (since one of your requirements is to not be able to instantiate it) and make it implement .addElement()
: 使您的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);
}
}
Then implement ContainA
as ContainAll<A>
etc. The .addElement()
will work "automatically". 然后实现ContainA
作为ContainAll<A>
等.addElement()
会工作“自动”。
You need to add 你需要添加
public addElement(T b) {
list.add(b);
}
to your ContainAll
class. 到你的ContainAll
类。
Here is a solution: 这是一个解决方案:
//ClassA // ClassA的
package limitgeneric;
public class A {
}
//ClassB // ClassB的
package limitgeneric;
public class B {
}
//Class ContainAll // Class ContainAll
package limitgeneric;
public abstract class ContainAll<T> {
public abstract void addElement(T t);
}
//Class ContainA // Class 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);
}
}
//Class ContainB // Class ContainB
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);
}
}
//Main class //主要课程
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>();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.