gpt4 book ai didi

java - 从java中的抽象项类访问通用容器

转载 作者:行者123 更新时间:2023-12-02 12:16:40 25 4
gpt4 key购买 nike

我正在尝试实现一个关于其项目的通用容器。所有可能的项目类共享一个抽象基类,该基类提供对周围容器的访问。

以下代码显示了我最简单的方法:

public class GenericContainerProblem {

public static void main(String[] args) {
Container<SpecificItem> container = new Container<>();
new SpecificItem(container);
}

private static class Container<ItemType extends AbstractItem> {
private final List<ItemType> list = new ArrayList<>();

public Container() {
//
}

protected void addItem(ItemType specificItem) {
list.add(specificItem);
}
}

private static abstract class AbstractItem {
protected final Container<? extends AbstractItem> container;

public AbstractItem(Container<? extends AbstractItem> container) {
this.container = container;
container.addItem(this); // fails *
}
}

private static class SpecificItem extends AbstractItem {
public SpecificItem(Container<SpecificItem> container) {
super(container);
container.addItem(this); // succeeds
}
}

}

*) 错误:The method addItem(capture#3-of ? extends GenericContainer.AbstractItem) in the type GenericContainer.Container<capture#3-of ? extends GenericContainer.AbstractItem> is not applicable for the arguments (GenericContainer.AbstractItem)

这不能按原样工作,因为声明 ? extends AbstractItem 可能允许类型不匹配。 。我想我需要一些类型约束告诉编译器 Container<?> -AbstractItem 内使用的类型有效期为this .

我如何声明/调用 AbstractItem -class(及其构造函数)是否可以访问特定子类通用的容器?

最佳答案

据我所知,您需要使 AbstractItem 通用,以便指定它使用的容器的类型。您还需要在 AbstractItem 构造函数中使用未经检查的强制转换。

但是您真的确定想要在容器和被容器之间建立这样的双向关联吗?也许你应该重新考虑这个设计。

public class GenericContainerProblem {

public static void main(String[] args) {
Container<SpecificItem> container = new Container<>();
new SpecificItem(container);
}

private static class Container<ItemType extends AbstractItem<ItemType>> {
private final List<ItemType> list = new ArrayList<>();

public Container() {
//
}

protected void addItem(ItemType specificItem) {
list.add(specificItem);
}
}

private static abstract class AbstractItem<T extends AbstractItem<T>> {
protected final Container<T> container;

public AbstractItem(Container<T> container) {
this.container = container;
container.addItem((T) this);
}
}

private static class SpecificItem extends AbstractItem<SpecificItem> {
public SpecificItem(Container<SpecificItem> container) {
super(container);
container.addItem(this);
}
}

}

关于java - 从java中的抽象项类访问通用容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46119293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com