为何泛型超类型的Java类型推断在此中断?

问题描述 投票:3回答:2

给出此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);
    }
}

初始化listlist2list3的表达式可以正常工作。但是,表达式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。那么,为什么在list4list1的情况下(对于该问题,对于list3的赋值),optionalEntry的类型推理也会中断?

特别是我不明白为什么list1的分配不起作用,为什么list4的分配起作用。

给出此Java代码:import java.util.AbstractMap.SimpleEntry;导入java.util.Arrays;导入java.util.List;导入java.util.Map.Entry;导入java.util.Optional;公共类测试{public ...

java generics type-inference
2个回答
0
投票

泛型是不变的。因此,List<Optional<Entry<Integer, String>>>List<Optional<SimpleEntry<Integer, String>>>不同。您必须使用有界通配符来增加这种灵活性。因此,这应该可以修复编译错误。


0
投票

因此,我们明确地写出我们期望推断的类型。另外,我们将声明放在用法附近。

© www.soinside.com 2019 - 2024. All rights reserved.