gpt4 book ai didi

java - 无法将具有泛型方法的功能接口(interface)转换为 lambda 表达式

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:09:57 24 4
gpt4 key购买 nike

无法将具有泛型方法的函数式接口(interface)转换为 lambda 表达式。
以下代码正在运行。它没有 lambda 表达式,即使用匿名类。

public interface Pro{
public <T> void callee(T t);
}

public void fun(Pro obj){}


public void implement() {
fun(new Pro() {
@Override
public <Integer> void callee(Integer t){}
});
}

我无法理解如何使用 lambda 表达式而不是匿名类。
在自己尝试之后,我使用了 netbeans 中显示的提示。我用所示的灯泡来做。

enter image description here

这就是我得到的,错误。

public void implement() {
fun((Integer t) -> {
});
}

显示错误。此处使用的正确 lambda 表达式是什么?
这是错误:

one\LambdaScopeTest.java:18: error: incompatible types: invalid functional descriptor for lambda expression
fun((Integer t) -> {
^
method <T>(T)void in interface Pro is generic
where T is a type-variable:
T extends Object declared in method <T>callee(T)
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get
full output

最佳答案

主要问题是您有一个通用的方法,而不是一个通用的接口(interface)。这没有多大意义。一旦您改为通用接口(interface),它就可以工作:

@FunctionalInterface
interface Pro<T> {
void callee(T t);
}

public class Test {
public static <T> void fun(Pro<T> obj){}

public static void main(String[] args) {
fun((Integer t) -> {});
}
}

接口(interface)是通用的更有意义,因为对于不同的类型有不同的实现是有意义的。对于通用的方法,建议每个实现都应该能够接受任何类型的任何值,因为调用者会指定它 - 如果您随后使用 lambda 表达式,这就没有意义了特定类型。

您的原始版本之所以有效,是因为您声明了一个名为 Integer 的泛型类型参数...您没有Integer 指定一个实现 类型。换句话说,这:

fun(new Pro() {
@Override
public <Integer> void callee(Integer t){}
});

相当于:

fun(new Pro() {
@Override
public <T> void callee(T t){}
});

...而且我不知道有什么方法可以将 that 表示为 lambda 表达式。基本上,我认为您的原始界面不适合 lambda 表达式。

关于java - 无法将具有泛型方法的功能接口(interface)转换为 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25245448/

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