Java:如何创建特定父类型的集合而不是其子类型?

时间:2008-12-11 05:43:40

标签: java generics

我正在学习Java测试(明天),我想知道一个可能永远不会出现的问题,但让我很好奇。

是否可以创建一个新的集合类,例如列表或只能包含特定类型而不包含其子类型的东西?我会使用泛型来实现这个目标吗?

4 个答案:

答案 0 :(得分:3)

不是真的,或者至少不是实际的。

子类型应该像数学集理论中的集合一样运行。如果B是A的子集,则B中的任何项目也是A中的项目。

同样,如果B是A的子类型,则B中的任何项目也是A的项目。因此,任何A的集合都必须能够维护B的项目。

话虽如此,可能会有令人沮丧的方式,B可以覆盖某些操作,以明确地破坏在集合中使用它或实例化它的能力。

我不认为仿制药会解决这个问题。

答案 1 :(得分:3)

如果您创建自定义集合类,则可以使用反射检查插入对象的类,如果它不是特定的确切类型,则拒绝它。或者,如果您可以控制集合中包含的类的类定义,那么将其设置为final将阻止创建子类。 (显然,如果您需要其他用途的子类,这是一个问题)

答案 2 :(得分:3)

问题是:你为什么要那样。如果您有一个包含动物的列表,为什么您只想用“基础动物”填写该列表,但是要防止将狗或猫添加到列表中。 OO的一个基本概念是,在基类(Wikipedia: Liskov substitution principle)的实例中,您需要使用子类的实例。如果这不适用于您的情况,那么您的类层次结构可能会出现问题。

答案 3 :(得分:2)

您可以在包含的类的类定义中使用“final”来禁止对其进行子类型化。我没有立即看到你如何测试这个或限制你的泛型需要最后的课程。您可以使用反射来测试类是否具有最终修饰符集,例如在构造集合时,如果不是则抛出它。

如果类本身不是最终的,则可以检查添加到集合中的每个对象,以确保其运行时类完全是集合所需的类,而不是它的子类。

请参阅http://java.sun.com/docs/books/tutorial/reflect/了解有关Java的反思信息。