java - 使用接口(interface)而不是类来定义泛型

标签 java class generics inheritance interface

如何指定我想要任何实现 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/

相关文章:

generics - 是否可以从函数中返回具有随机类型的泛型结构

java - 用于 Java 结尾大括号的 Eclipse 格式化程序

c# - 如何在运行时获取当前类名?

javascript - javascript可以从构造函数内部传递自身吗

Javascript,添加构造函数的类

java - 我怎样才能获取这个工作代码并使其使用java泛型?

java - 如何获得某个地区/国家/地区的一周的第一天

java - 如何使用Netty从设备读取完整数据?

java - 基于 servlet 的堆栈是否有显着的开销?

c# - 为什么嵌套公共(public)类比它的父类更难访问?