gpt4 book ai didi

java 。 lambda 中预期的数组类型

转载 作者:行者123 更新时间:2023-12-01 17:46:33 25 4
gpt4 key购买 nike

所以,我有一个对象构造函数:

public Func(Function<Var[], Var<T>> function, Var... arguments) {
// Function is a standart 1.8 class
//...
//secret stuff
}

我这样调用它:

return new Func(new Function<Var[], Var>() {
@Override
public Var apply(Var[] args) {
return instance.getAttribute(args[0].value());
}

}, arguments[0].unpack(instance) // unpack(...) returns Var object
);

而且它有效。现在,我的 IDE (Intellij IDEA) 建议我用 lambda 替换函数声明。好的,让我们开始吧:

return new Func(
args -> instance.getAttribute(args[0].value()),
arguments[0].unpack(instance)
);

现在我在 args 上遇到错误:

Array type expected; found: 'java.lang.Object'

所以,显然 args 现在是 Object。为什么?这是 IDE 中的错误还是什么?

整个代码:

Template:

public class Template {
public static void main(String[] args) {
SomeClass someClass = new SomeClass();
System.out.println(someMethod(someClass).value());
}

private static class SomeClass {
Var[] var = new Var[12];

SomeClass() {
var = new Var[12];

for ( int i = 0; i < var.length; i++) {
var[i] = new Var<>(i * 4);
}
}

Var getAttribute(int index) {
return var[index];
}
}

public static Var someMethod(SomeClass instance) {
return new Func(new Function<Var[], Var>() {
@Override
public Var apply(Var[] args) {
return instance.getAttribute((int)args[0].value());
}
}, new Var(4));
}
}

Var.java:

public class Var<T> {
private T value;

public Var(T value) {
this.value = value;
}

public T value() {
return value;
}
}

Func.java:

public class Func<T> extends Var<T> {
private Function<Var[], Var<T>> function;
private Var[] args;

public Func(Function<Var[], Var<T>> function, Var... args) {
super(null);

this.function = function;
this.args = args;
}

@Override
public T value() {
return function.apply(args).value();
}
}

最佳答案

错误消息也出现在 Eclipse-IDE 中:

The type of the expression must be an array type but it resolved to Object

我认为这不是 IDE 错误,无论是在 IntelliJ 还是在 Eclipse 中。编译器处理 lambda 表达式始终需要 target type这是一个函数式接口(interface)。对于

的情况
 args -> instance.getAttribute((int)args[0].value()) 

目标类型由 Func 构造函数的第一个参数确定

 Function<Var[], Var<T>> function

但是,这个功能接口(interface)是一个通用接口(interface)。 Java 使用 type erasure 编译泛型这意味着用对象类型替换通用参数类型。因此,界面编译如下

 interface Function {
public Object apply(Object args);
}

这被用作目标类型。因此,对于 args,需要使用 Object 类型而不是 Var[] 类型,这会导致错误消息。

对于匿名类,情况有所不同,因为提供了更多信息来确定目标类型。

 new Function<Var[], Var>(){...}

显式包含类型信息。因此,args 应该是 Var[] 类型,并且不会显示错误消息。

修复错误有两种可能性:

1) 在 getAttribut-method 中将 args 显式转换为 Var[],即替换

 (int)args[0].value()

 (int)((Var[])args)[0].value()

或 2) 不要使用通用接口(interface),即将接口(interface)更改为

 interface Function {
public Var apply(Var[] args);
}

然后类型信息被保留。当然,其余代码必须进行相应调整。

关于 java 。 lambda 中预期的数组类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52878891/

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