Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用泛型类型及其自身类型的通配符_Java_Android_Generics - Fatal编程技术网

Java 使用泛型类型及其自身类型的通配符

Java 使用泛型类型及其自身类型的通配符,java,android,generics,Java,Android,Generics,这是我关于Stackoverflow的第一个问题,所以如果我做错了什么,请告诉我,以便下次我可以改进它 因为我已经有一段时间没有用Java做过一些编程了,甚至只是一些简单的东西,所以我仍然在学习很多非功能性的东西,并且觉得阅读这个网站上的讨论很有帮助 我以为我了解泛型的工作方式,直到我遇到以下问题。我知道这不是最好的设计,或者有其他方法可以解决它,但是我们必须这样做。 (它是应用程序中的一个底层,所以我喜欢泛型与顶层建立连接。) 形势 基类可识别由可分组扩展,该类可由项、突变、位置等扩展 我补充

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

因为我已经有一段时间没有用Java做过一些编程了,甚至只是一些简单的东西,所以我仍然在学习很多非功能性的东西,并且觉得阅读这个网站上的讨论很有帮助

我以为我了解泛型的工作方式,直到我遇到以下问题。我知道这不是最好的设计,或者有其他方法可以解决它,但是我们必须这样做。
(它是应用程序中的一个底层,所以我喜欢泛型与顶层建立连接。)

形势
基类
可识别
可分组
扩展,该类可由
突变
位置
等扩展

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

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.
}
问题
“partOf”的泛型让我感到痛苦。我需要返回一个扩展了Groupable(当然)类型的组列表,并间接地超越这个对象所属的类。当然,突变不能是项目列表的一部分

我考虑过在Groupable中使用类型参数,但我觉得这并不正确。 通过这种方式,您可以实例化一个将其类作为其父项类型的项,这是可能的,但并不好。通过这种方式,可以返回和存储其自身类型的组,但不能返回和存储超级类型的组

最后
我不知道这是否清楚,我真的不知道如何简化保留所有元素的问题

如果存在一个出色的解决问题的设计,并且牢记所有这些类都是为了在一个“通用”的环境中扩展和使用的如果可能的话,非常感谢

我读过关于只使用原始类型的文章,但这似乎并不正确,尽管假设不会发生不好的铸造是安全的。如果有人能解释Java如何使用通配符进行这种通用嵌套,以及解决这个特定问题的正确方法,再次非常感谢


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

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

这里还有另一个问题,那就是它(对我来说)没有真正意义。例如,如果Groupable类被Item类扩展了呢。考虑到它基本上是它的兄弟,但唯一能将它们联系起来的是一个共同的父对象,它包含一个组集合是否有意义

我建议以这种方式修改代码:

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;
    }
}
类可分组扩展
{

private ArrayListRelated:。在您的情况下,我不推荐我在这里解释的解决方案,而是尝试将跟踪其他组的责任与另一种类型分离。请参阅我与该方法相关的答案:我必须研究您的第一个陈述,目前我倾向于不同意您的观点,一个类可以有任何其他class作为一个实例变量imho,parent,child,任何东西,但正如我所说的,我会研究这个。第二,正如你所说的,意义在于,物品知道它是什么组的一部分。一个物品我和其他一些物品一起包装,密封,做成一个组。这个组再次与另一组中的其他物品一起包装,一个托盘或其他东西像这样,它被移动、运送等等。另一个解决方案是由一个经理提供知识,而不搜索所有组。@RinusHoog为什么你会在一个家长中有任何与孩子有关的特定信息?这似乎是对OOP的滥用。
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;
    }
}