Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 声明泛型方法,需要澄清_Java_Generics - Fatal编程技术网

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,我明白了。。因此,不使用强制转换的赋值是不可能的,使用强制转换的赋值正确地生成警告。再次感谢