gpt4 book ai didi

java - 为什么java推理失败

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:37 27 4
gpt4 key购买 nike

我有以下看似相似的方法,do1do2:

class Demo<A>{
public <C> Iterable<C> do1(List<? super C> _a) {
return null;
}


public <C extends D, D> Iterable<C> do2(List<D> _a) {
return null;
}

{
List<? extends A> leA = null;

do2(leA);
do1(leA);
}
}

当我编译以上代码 (javac 1.8.0_92) 时,调用 do2(leA) 有效,而 do1(leA) 失败。

required: List<? super C>
found: List<CAP#1>
reason: cannot infer type-variable(s) C
(argument mismatch; List<CAP#1> cannot be converted to List<? super C>)
where C,A are type-variables:
C extends Object declared in method <C>do1(List<? super C>)
A extends Object declared in class Cache
where CAP#1 is a fresh type-variable:
CAP#1 extends A from capture of ? extends A

现在我想知道:这是由于 javac 中类型推断的不完整实现,还是我通过调用 do1(leA) 创建了一个无效的类型树?

据我所知:

  • do1(leA) 中:Capture(? extends A) 成为 C 的父类(super class)型
  • do2(leA) 中:Capture(? extends A) 成为 C 的父类(super class)型(间接通过:Capture(? extends A) == D D :> C

意味着在这两种情况下 C 应该(没有错误)解析为 "? extends A"

最佳答案

您需要extends C 而不是super C:

public <C> Iterable<C> do1(List<? extends C> _a) {

Csuper 是祖先类,而不是子类。

关于java - 为什么java推理失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37071678/

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