2014-01-24 26 views
1

这是我在Stackoverflow上的第一个问题,所以如果我做错了什么,请告诉我,以便下一次改进。对自己的类型使用带有通配符的通用类型

由于我已经用Java编写了一些程序,甚至只是一些简单的东西,我仍然在学习很多关于功能的知识,并且发现阅读本网站的讨论很有帮助。

我以为我了解泛型的工作方式,直到遇到以下问题。我知道这不是最好的设计,或者有办法以另一种方式来解决它,但是让我们说它必须这样做。
(其目的是作为应用程序中的低层,所以我喜欢泛型以与在上面的层的连接。)

现状
甲基类IdentifieableGroupable延伸,一类

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. 
} 
:可以通过 ItemMutationLocation

作为基团必须由这些东西,我添加扩展

我加入通用这里来限制能够限制一组项目,突变等一组必须是可分组了。

正如我希望能够知道我是哪个组部分我设计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”是什么让我痛苦。我需要返回其延伸可分组(当然),并间接SUPERS此对象的类是实例的类型的组的列表。突变当然不能成为物品清单的一部分。

我曾考虑在Groupable中使用类型参数,但这对我来说似乎并不正确。 您实例,从而有它的类作为一个类型,它的母公司,这是可能的,但不是很好的项目的方式。这样可以返回并存储它自己类型的组,但不能超级类型的组。

最后
我不知道这是明确的,我真的不知道该如何与保存的所有元素简化问题。

如果存在一个出色的解决问题的设计,记住所有这些类都被扩展并用作“通用”;)方式可能,非常感谢。

我读过关于使用原始类型,但这似乎并不正确,虽然已经安全地假设没有不良铸造会发生。如果有人可以用通配符解释Java用这种通用嵌套进行的操作以及解决这个特定问题的正确方法,再次非常感谢。

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

+1

相关:[?有没有一种方法来指代当前类型与类型变量(http://stackoverflow.com/questions/ 7354740/IS-有-A-方式对参考到的电流型与A型变量)。在你的情况下,我不会推荐我在那里解释的解决方案,而是试图将跟踪其他组的跟踪责任分开。我在这里看到我的答案与这种方法有关:http://stackoverflow.com/a/17076406/697449 –

回答

1

你不能开到可分组类包含组的集合。它的主要原因是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; 
    } 
} 
+0

我必须研究你的第一个陈述,此刻我倾向于不同意你,一个类可以有任何其他类作为一个实例变量imho,父母,孩子,任何东西,但正如我所说,我会研究这一点。其次,你所说的意义在于,该项目知道它属于哪个组。一个项目我挤满了一些其他人,密封,组成一个小组。这个团队再次与另一组中的其他物品,托盘或类似物品一起包装,这些物品被移动,装运等。另一种解决方案是提供知识而不搜索所有群体的管理者。 – RinusHoog

+1

@RinusHoog为什么你会在父母的任何具体信息涉及其子女?这似乎是OOP的滥用。 – user3230483