声明泛型方法,需要澄清
请考虑以下 2 个方法声明:
1. public abstract <T extends MetaData> List<T> execute();
2. public abstract List<? extends MetaData> execute();
两者似乎都返回扩展元数据的对象列表。
请问它们之间有什么区别?
请考虑以下 2 个方法声明:
1. public abstract <T extends MetaData> List<T> execute();
2. public abstract List<? extends MetaData> execute();
两者似乎都返回扩展元数据的对象列表。
请问它们之间有什么区别?
在第一种情况下,您将允许Java使用类型推断并推断每个调用站点的类型。T
在第二种情况下,您将始终得到 a,因此无法将其分配给任何较窄类型的变量,例如 .List<? extends MetaData>
List<IntegerMetaData>
如果有任何子类型,则第一个版本只能返回空列表或 。第二个版本可能返回一个列表,其中包含 的实例及其子类型。MetaData
null
MetaData
示例:Say 和 是 的子类型,并返回一个包含 的实例的列表。调用方可能调用了 execute,如下所示:A
B
MetaData
execute
A
List<B> list = execute(); // the second version does not allow this
呼叫者说他想要一个列表,但得到了一个包含.由于类型擦除,无法知道调用方请求的内容。因此,无法实现第一个版本(除了返回或空列表)。B
A
execute
null