我正在尝试设计一种特殊类型的集合,它只能包含自己类型的元素。此集合类还必须是可扩展的。乍一看,这似乎是一个足够简单的任务:
public class MyClass<E extends MyClass> implements Collection<E>{
//insert Collection<E> methods here...
}
但是,因为其中一个集合可能只包含作为其类实例的元素,所以不应该有以下内容:
public class MySubclass extends MyClass<MyClass>{}
我需要的是一个MyClass版本,基本上执行以下操作(不要尝试编译这个版本):
public class MyClass<E extends this.getClass()> implements Collection<E>{...}
有可能实现这样的东西吗?如果是这样,怎么办呢?
答案 0 :(得分:1)
我认为您正在寻找的签名将是这样的:
public class MyClass<E extends MyClass<E>> ...
这个的问题,以及为什么我认为你不能从声明的角度强制执行你想要的是你有一个无限循环。如果集合可能只包含自己类型的元素,那么元素只能包含其自身的元素等等。
你现在有一个无限循环,你可能只包含集合,而且你的集合中不会包含一些东西。
另外,请记住,在运行时,类型擦除会消除所有泛型类型。因此,无论您的通用声明多么花哨,任何人都可以执行以下操作并获得警告:
new MyClass();
这也是为什么尝试强制执行此类结构可能效果不佳的另一个原因。
相反,您可以对add
方法进行适当的检查,以提供运行时实施。仍然有无限循环问题。
修改强>
要进行运行时检查,请执行以下操作:
public boolean add(E element){
if (!(element instanceof MyClass))
throw new IllegalArgumentException("Element is not an instance of MyClass");
// rest of add code here
}