gpt4 book ai didi

java - 使用带有通配符的泛型类型作为它自己的类型

转载 作者:行者123 更新时间:2023-11-30 03:08:43 25 4
gpt4 key购买 nike

这是我在 Stackoverflow 上的第一个问题,所以如果我做错了什么,请告诉我,以便我下次改进。

自从我用 Java 完成一些编程以来已经有一段时间了,即使当时只做了一些简单的东西,我仍然在学习很多关于很多功能的知识,并且发现阅读这个网站上的讨论很有帮助。

在我遇到以下问题之前,我以为我了解泛型的工作方式。我知道这不是最好的设计,或者有其他方法可以解决它,但假设它必须以这种方式完成。
(它旨在作为应用程序中的低层,所以我喜欢泛型与顶层建立联系。)

情况
基类 IdentifieableGroupable 扩展,该类可以由 ItemMutation位置

由于组必须由这些东西组成,我补充说:

class Group<T extends Groupable> extends Groupable
{

public Group(Id id)
{
super(id);
content = new HashMap<T, Integer>();
}

private final HashMap<T, Integer> content;
// Additional methods for adding, removing etc.
}

我在这里添加了 Generic 以限制能够将组限制为项目、突变等。组也必须是可分组的。

因为我想知道我属于哪个组,所以我设计了我的 Groupable 如下:

    class Groupable extends Identifieable
{

public Groupable(Id id)
{
super(id);
partOf = new ArrayList<Group<? extends Groupable>>();
}

private ArrayList<Group<? extends Groupable>> partOf;

private final ArrayList<Group<? extends Groupable>> containingGroups()
{
return partOf;
}
}

问题
“partOf”的通用类型让我很痛苦。我需要返回一个扩展 Groupable 类型的组列表(当然),并间接取代这个对象是其实例的类。当然,Mutation 不能是 Items 列表的一部分。

我考虑过在 Groupable 中使用类型参数,但这对我来说似乎不正确。这样你就可以实例化一个 Item ,它有它的类作为它的父类的类型,这是可能的但不是很好。这样就可以返回和存储自己类型的组,而不是父类(super class)型的组。

终于
我不知道这是否清楚,我真的不知道如何通过保留所有元素来简化问题。

如果存在一个出色的解决问题的设计,请牢记所有这些类都应该以尽可能“通用”的方式进行扩展和使用;)非常感谢。

我读过有关仅使用原始类型的信息,但这似乎并不正确,尽管假设不会发生错误的转换已经是安全的。如果有人可以解释 Java 是如何处理这种带通配符的泛型嵌套的,以及解决这个特定问题的正确方法,再次非常感谢。

我对正确的方法或理论解释比解决方法更感兴趣,还没有错误,因为我不知道如何实现它。

最佳答案

您不能规定 Groupable 类包含组的集合。这样做的主要原因是 Group 类扩展了 Groupable,因此在编译 Groupable 类时它是未知的(不能)。

这里的另一个问题是(对我而言)它真的没有意义。例如,如果 Groupable 类由 Item 类扩展会怎样。它包含一组组是否有意义 - 考虑到它基本上是它的 sibling ,但唯一能连接它们的是一个共同的 parent 。

我建议这样修改代码:

class Groupable extends Identifiable
{
private ArrayList<? extends Groupable> partOf;

public Groupable(String id)
{
partOf = new ArrayList<Groupable>();
}


private final ArrayList<? extends Groupable> containingGroups()
{
return partOf;
}
}

关于java - 使用带有通配符的泛型类型作为它自己的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21342696/

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