[英]Java Generics limit type
在Java中,我有以下類結構:
全部
+ - A類擴展全部
+ - B級擴展All
class 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);
}
}
但這個例子不起作用,我試了一下。 謝謝閱讀。
使您的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()
會工作“自動”。
你需要添加
public addElement(T b) {
list.add(b);
}
到你的ContainAll
類。
這是一個解決方案:
// ClassA的
package limitgeneric;
public class A {
}
// ClassB的
package limitgeneric;
public class B {
}
// Class ContainAll
package limitgeneric;
public abstract class ContainAll<T> {
public abstract void addElement(T t);
}
// 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
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>();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.