我正在学习Java测试(明天),我想知道一个可能永远不会出现的问题,但让我很好奇。
是否可以创建一个新的集合类,例如列表或只能包含特定类型而不包含其子类型的东西?我会使用泛型来实现这个目标吗?
答案 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的反思信息。