gpt4 book ai didi

java - java泛型中奇怪的类型错误

转载 作者:行者123 更新时间:2023-11-30 04:39:58 25 4
gpt4 key购买 nike

我在以下代码中遇到了一个奇怪的问题(嗯,不完全是这个代码):

public class CompilationProblems1 {

static Box<Class<? extends AlcoholicBewerage>> brokenBoxOfOneBeer = boxOf(Beer.class);
static Box<? extends Class<? extends AlcoholicBewerage>> boxOfOneBeer = boxOf(Beer.class);
static Box<Class<? extends AlcoholicBewerage>> boxOfBeerAndVodka = boxOf(Beer.class, Vodka.class);

interface AlcoholicBewerage {}

class Beer implements AlcoholicBewerage {}

class Vodka implements AlcoholicBewerage {}

static class Box<T> {}

static <E> Box<E> boxOf(E e) {
return new Box<E>();
}

static <E> Box<E> boxOf(E e1, E e2) {
return new Box<E>();
}
}

第一个声明 brokenBoxOfOneBeer 给出编译错误:

found   : lt.tool.CompilationProblems1.Box<java.lang.Class<lt.tool.CompilationProblems1.Beer>>
required: lt.tool.CompilationProblems1.Box<java.lang.Class<? extends lt.tool.CompilationProblems1.AlcoholicBewerage>>
static Box<Class<? extends AlcoholicBewerage>> brokenBoxOfOneBeer = boxOf(Beer.class);

此错误发生在 OpenJDK 6、Eclipse 和 IntelliJ 上。我知道这是类型推断器的限制。

在第三种情况(boxOfBeerAndVodka)中,编译器能够推断出正确的协变类型,因为我相信它有两个子类型可供选择。但为什么编译器无法编译第一个声明,但可以编译第二个声明?

最佳答案

But why isnt' the compiler able to compile the first declaration, but is OK with the second one?

在这两种情况下,表达式 boxOf(Beer.class)类型为Box<Class<Beer>> .

  • 第一个声明需要其类型为 Box<Class<? extends AlcoholicBewerage>> ;自 Box<Class<Beer>>不是 Box<Class<? extends AlcoholicBewerage>> 的子类型,这行不通。 ( Class<Beer>Class<? extends AlcoholicBewerage> 的子类型,但由于不变性,这并不意味着 Box<Class<Beer>>Box<Class<? extends AlcoholicBewerage>> 的子类型。)
  • 第二个声明需要其类型为 Box<? extends Class<? extends AlcoholicBewerage>> ——确实如此。 Class<Beer>Class<? extends AlcoholicBewerage> 的子类型,因此Box<Class<Beer>>Box<? extends Class<? extends AlcoholicBewerage>> 的子类型.

也就是说,您的声明中发生的事情与以下情况完全相同:

List<Object> foo = new ArrayList<String>(); // doesn't work
List<? extends Object> bar = new ArrayList<String>(); // works

它看起来更复杂,因为而不是 ObjectString你有另一个级别的泛型类型。

关于java - java泛型中奇怪的类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12533375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com