Java 如何使用类型参数实现容器/元素类?

Java 如何使用类型参数实现容器/元素类?,java,generics,Java,Generics,我的问题简短而抽象: 我想实现一个容器类,它的类型由它所包含元素的元素类类型参数化(即容器)。到目前为止没有什么特别的。但是:元素类及其子类应提供一个寄存器方法,将元素实例添加到给定的容器类(即寄存器(Container),与其他一些语言不同。Java不提供表示“this class”的关键字因此,没有简单的方法强制执行寄存器只接受类型的容器超类。因此,让行容器。添加(此);工作是有问题的 如前所述,一个可能的解决方法是使元素通用化。这种方法有各种各样的问题(我个人非常不喜欢),包括通过“get

我的问题简短而抽象:


我想实现一个
容器
类,它的类型由它所包含元素的
元素
类类型参数化(即
容器
)。到目前为止没有什么特别的。但是:
元素
类及其子类应提供一个
寄存器
方法,将
元素
实例添加到给定的
容器
类(即
寄存器(Container),与其他一些语言不同。Java不提供表示“this class”的关键字因此,没有简单的方法强制执行
寄存器
只接受
类型的
容器
超类
。因此,让行
容器。添加(此);
工作是有问题的

如前所述,一个可能的解决方法是使
元素
通用化。这种方法有各种各样的问题(我个人非常不喜欢),包括通过“getThis技巧”解决的问题

一个问题是,它不容易与3个类/接口链一起工作

Sub1Element extends ElementBasis implements Element
如果您将
ElementBasis
设置为泛型以及
Element
(链接问题的所有解决方案都只涉及长度为2的链),则可以这样做。为了简单起见,我将
集合
替换为
容器

public interface Element<E extends Element<E>> {
    void register(Collection<? super E> container);
}

public class ElementBasis<E extends ElementBasis<E>> implements Element<E> {
    @Override
    public void register(Collection<? super E> collection) {
        collection.add((E) this);     // Unchecked cast
    }
}

public class Sub1Element<E extends Sub1Element<E>> extends ElementBasis<E> {
    @Override
    public void register(Collection<? super E> collection) {
        collection.add((E) this);     // Unchecked cast
    }
} 
然而,通配符非常令人困惑,而且一开始似乎没有必要(尽管它们不是)

考虑到这种方法的所有问题,我会避免它

我的首选方法是去掉所有类型参数,停止尝试将
寄存器
设置为
元素
的成员,而是使用静态方法

public static <E extends Element> void register(E e, Collection<? super E> collection) {
    collection.add(e);
}

publicstaticvoidregister(E,collection)你是说
ContainerBasis
ContainerBasis你当然是对的,保罗。它不是
ContainerBasis
,而是
ElementBasis
。对不起,我已经更正了。
public static <E extends Element> void register(E e, Collection<? super E> collection) {
    collection.add(e);
}