Java 创建始终使用泛型扩展类的泛型

Java 创建始终使用泛型扩展类的泛型,java,generics,Java,Generics,我试图设计一种特殊类型的集合,它可能只包含自己类型的元素。此集合类也必须是可扩展的。乍一看,这似乎是一项非常简单的任务: public class MyClass<E extends MyClass> implements Collection<E>{ //insert Collection<E> methods here... } 公共类MyClass实现集合{ //在此处插入收集方法。。。 } 但是,由于其中一个集合可能只包含属于其类实例的元素

我试图设计一种特殊类型的集合,它可能只包含自己类型的元素。此集合类也必须是可扩展的。乍一看,这似乎是一项非常简单的任务:

public class MyClass<E extends MyClass> implements Collection<E>{
    //insert Collection<E> methods here...
}
公共类MyClass实现集合{
//在此处插入收集方法。。。
}
但是,由于其中一个集合可能只包含属于其类实例的元素,因此不可能出现以下情况:

public class MySubclass extends MyClass<MyClass>{}
public类MySubclass扩展MyClass{}
我需要的是MyClass的一个版本,它基本上可以执行以下操作(不要尝试编译此版本):

公共类MyClass实现集合{…}

有可能实现这样的东西吗?如果是这样,怎么做?

我想你要找的签名应该是这样的:

 public class MyClass<E extends MyClass<E>> ...
这也是为什么试图实施这种类型的结构可能不会奏效的另一个原因

相反,您可以在
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
}

当需要相同类型的节点树时,“无限循环”可能是可以接受的。和
newmyclass()可以通过制作
MyClass
abstract
.WRT abstract很容易被禁止,但仍然可以做
子类扩展MyClass{}
。在Java中,不需要使用泛型,它只给出原始类型警告。+1(如果可以的话)作为签名;它不允许MySubclass扩展MyClass,这是朝着正确方向迈出的一步!然而,使MySubclass扩展MyClass仍然允许向其中添加一个超类(但仅限于MyClass,而不是Object)。是的,霍尔格是正确的,一个节点链正是我们想要的;这些收藏品完全是为了成为唯一保存下来的东西。也许运行时强制添加对我有用。你介意演示一下如何着手做这样的事情吗?没错,你不能强制使用泛型,但如果你真的尝试的话,还有很多其他的事情可以避免。重要的是编译器将引导您达到预期的目的。更重要的是,如果您有一个满足泛型签名的
MySubclass
,您仍然可以创建一个符合
MySubclass
意图的泛型子类,而不会得到警告。基类不能将其子类强制为
final
。这意味着我不再寻找解决方案,不是吗?我觉得当我得到了一个可以接受的答案,或者这被证明是完全不可能实现的时候,最好保留这个选项。不过,我非常感谢你们两位的意见!今天晚些时候我一定会检查一下。
 new MyClass();
public boolean add(E element){
     if (!(element instanceof MyClass))
          throw new IllegalArgumentException("Element is not an instance of MyClass");

    // rest of add code here
}