如何指定我想要任何实现 A
的对象List
内部允许的接口(interface)以类型安全的方式?我希望能够在所有对象上调用 A 的给定方法,关于 Class
键入它们。
public interface A (){}
List<? extends A> myList = new ArrayList<? extends A>();
我得到:Cannot instantiate the type ArrayList<? extends A>
如果我将泛型保留在实例化方面,它可以正常工作,但我必须指定 @SuppressWarnings({ "rawtypes", "unchecked" })
让编译器对警告保持沉默。
最佳答案
了解为什么实例化 new ArrayList<? extends A>()
没有意义。 ,实际上我们可以等效地创建一个 new ArrayList<B>()
与任意类或接口(interface) B
(即使是与您的任何对象都不相关的对象)实现 A
,并且所创建的 ArrayList 可以安全地分配给 ArrayList<? extends A>
类型的变量。那么你可能会想,哦,这太愚蠢了,因为我要放入其中的对象不是B类的,那这怎么可能是一样的呢?但它是一样的,因为你不能将任何东西放入 Something<? extends A>
类型的引用中。反正。这就是为什么创建 new ArrayList<? extends A>()
没有意义。 .
How can I specify that I want any object that implements the A interface to be allowed inside of the List in a type-safe manner? I want to be able to invoke a given method of A over all of the objects, regarding what Class type they are.
这正是ArrayList<A>
是。它允许 A
的所有实例(当然,所有实现 A
的对象都是 A
的实例)并且您可以使用 A
的任何方法在他们。像这样的东西就是你想要的:
List<A> myList = new ArrayList<A>();
类似于 List<? extends A>
仅在以下情况下使用:您将从其他代码中获取 List 对象,并且您不知道(或不关心)它们创建它所用的通用参数到底是什么。 (在这种情况下,您无法将对象放入列表中。)这与您的情况完全不同,您正在创建列表对象,因此您决定并因此确切地知道使用什么通用参数.
关于java - 使用接口(interface)而不是类来定义泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7140595/