Java 声明泛型方法,需要澄清
考虑以下两种方法声明:Java 声明泛型方法,需要澄清,java,generics,Java,Generics,考虑以下两种方法声明: 1. public abstract <T extends MetaData> List<T> execute(); 2. public abstract List<? extends MetaData> execute(); 1。公共抽象列表execute(); 2.公共摘要列表在示例1中,您不能返回泛型类型为T的列表,例如: @Override public <T extends MetaData> List<
1. public abstract <T extends MetaData> List<T> execute();
2. public abstract List<? extends MetaData> execute();
1。公共抽象列表execute();
2.公共摘要列表在示例1中,您不能返回泛型类型为T
的列表,例如:
@Override
public <T extends MetaData> List<T> execute() {
List<T> l = new ArrayList<T>();
return l;
}
@Override
public List<? extends MetaData> execute2() {
List<MetaData> l = new ArrayList<MetaData>();
return l;
}
有什么区别?在第一种情况下,该方法有一个泛型类型,T
,您必须返回与该类型相关的内容。在第二种情况下,您只返回泛型类型,但方法本身没有泛型类型。在第一种情况下,您将允许Java使用类型推断并在每个调用站点推断T
的类型
在第二种情况下,您总是会得到一个列表如果存在元数据的任何子类型
,那么第一个版本只能返回一个空列表或null
。第二个版本可能返回一个包含元数据的实例及其子类型的列表
示例:假设A
和B
是元数据的子类型
,execute
返回包含A
实例的列表。调用者可能调用了execute,如下所示:
List<B> list = execute(); // the second version does not allow this
List List=execute();//第二个版本不允许这样做
打电话的人说他想要一个B
s的列表,但得到了一个包含a
的列表。由于类型擦除,execute
的实现无法知道调用者要求什么。因此,无法实现第一个版本(除了返回null
或空列表)。您认为如何?在第二种情况中没有提到T
。您的类的定义如下:public class Demo{…}
。这有什么帮助?问号是问号,它与T
有什么关系?Marko,谢谢你的回答。如果A扩展元数据
为什么List=execute()
无效?如果返回类型是ListOh,我明白了。。因此,不使用强制转换的赋值是不可能的,使用强制转换的赋值正确地生成警告。再次感谢