给出此Java代码:
import java.util.AbstractMap.SimpleEntry;
import java.util.Arrays;
import java.util.List;
import java.util.Map.Entry;
import java.util.Optional;
public class Test {
public static void main(String[] args) {
SimpleEntry<Integer, String> simpleEntry = new SimpleEntry<>(1, "1");
Optional<Entry<Integer, String>> optionalEntry = Optional.of(simpleEntry);
Optional<SimpleEntry<Integer, String>> optionalSimpleEntry = Optional.of(simpleEntry);
List<Entry<Integer, String>> list1 = Arrays.asList(simpleEntry);
List<Optional<Entry<Integer, String>>> list2 = Arrays.asList(optionalEntry);
List<Optional<SimpleEntry<Integer, String>>> list3 = Arrays.asList(optionalSimpleEntry);
List<Optional<Entry<Integer, String>>> list4 = Arrays.asList(optionalSimpleEntry);
}
}
初始化list
,list2
和list3
的表达式可以正常工作。但是,表达式list4
的初始化在Eclipse中因以下错误而中断:
Type mismatch: cannot convert from List<Optional<AbstractMap.SimpleEntry<Integer,String>>>
to List<Optional<Map.Entry<Integer,String>>>
以及javac
中的此错误:
Test.java:16: error: incompatible types: inference variable T has incompatible bounds
List<Optional<Entry<Integer, String>>> list4 = Arrays.asList(optionalSimpleEntry);
^
equality constraints: Optional<Entry<Integer,String>>
lower bounds: Optional<SimpleEntry<Integer,String>>
where T is a type-variable:
T extends Object declared in method <T>asList(T...)
但是AbstractMap.SimpleEntry
直接实现Map.Entry
。那么,为什么在list4
到list1
的情况下(对于该问题,对于list3
的赋值),optionalEntry
的类型推理也会中断?
特别是我不明白为什么list1
的分配不起作用,为什么list4
的分配起作用。
给出此Java代码:import java.util.AbstractMap.SimpleEntry;导入java.util.Arrays;导入java.util.List;导入java.util.Map.Entry;导入java.util.Optional;公共类测试{public ...
泛型是不变的。因此,List<Optional<Entry<Integer, String>>>
与List<Optional<SimpleEntry<Integer, String>>>
不同。您必须使用有界通配符来增加这种灵活性。因此,这应该可以修复编译错误。
因此,我们明确地写出我们期望推断的类型。另外,我们将声明放在用法附近。