gpt4 book ai didi

java - 使用 lambda 会阻碍类型变量的推断

转载 作者:搜寻专家 更新时间:2023-10-30 20:01:47 24 4
gpt4 key购买 nike

我有以下编译成功的代码:

import java.lang.String;
import java.util.List;
import java.util.Arrays;

interface Supplier<R> {
Foo<R> get();
}

interface Foo<R> {
public R getBar();
public void init();
}

public class Main {

static private <V> void doSomething(final Supplier<? extends List<? extends V>> supplier) {
// do something
}

static public void main(String[] args) {
doSomething(new Supplier<List<Object>>(){
@Override
public Foo<List<Object>> get() {
return new Foo<List<Object>>(){
@Override
public List<Object> getBar() {
return null;
}
@Override
public void init() {
// initialisation
}
};
}
});
}
}

但是,如果我转换 Supplier对于以下 lambda 表达式,代码不再编译:

doSomething(() -> new Foo<List<Object>>(){
@Override
public List<Object> getBar() {
return null;
}
});

编译错误是:

Main.java:22: error: method doSomething in class Main cannot be applied to given types;
doSomething(() -> new Foo<List<Object>>(){
^
required: Supplier<? extends List<? extends V>>
found: ()->new Fo[...]; } }
reason: cannot infer type-variable(s) V
(argument mismatch; bad return type in lambda expression
<anonymous Foo<List<Object>>> cannot be converted to Foo<List<? extends V>>)
where V is a type-variable:
V extends Object declared in method <V>doSomething(Supplier<? extends List<? extends V>>)

如果我将供应商的声明更改为 Supplier<? extends List<V>> , 两种变体都编译成功。

我使用 Java 8 编译器编译代码。

为什么带有 lambda 的代码无法编译,尽管它等同于非 lambda 版本?这是 Java 的已知/预期限制还是错误?

最佳答案

如果我使用:

doSomething(() -> () -> null);

它工作正常,所有类型都由编译器正确推断。

如果我尝试你做:

doSomething(() -> () -> 1);

编译失败,这是正确的,因为 doSomething方法需要一个 Supplier<? extends List<? extends V>>参数和 () -> () -> 1不是。

如果我这样做:

doSomething(() -> () -> Arrays.asList(1, 2, 3));

它按预期工作。

所以这里不需要强制转换任何东西,只需使用 lambda 并让编译器完成它的工作就可以了。


编辑:

如果我这样做:

doSomething(() -> new Foo<List<? extends Object>>() {
@Override
public List<? extends Object> getBar() {
return null;
}
});

它编译没有错误。

归根结底,问题在于编译器认为 List<Object>List<? extends Object> 不同,当您使用 lambda 表达式时,它只会(错误地)提示它。不过,它不会提示匿名内部类,所以这一切都表明这是一个错误。

关于java - 使用 lambda 会阻碍类型变量的推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52445222/

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