gpt4 book ai didi

java - 使用泛型的 lambda 中的错误类型检测

转载 作者:行者123 更新时间:2023-11-30 06:46:51 27 4
gpt4 key购买 nike

我遇到了一个奇怪的问题。我有三个简化的演示类:

public interface Clicker<T> {
void onClick(T obj);
}

public final class QueryError {

private String type, message;

public QueryError(String type, String message) {
this.type = type;
this.message = message;
}

public String getType() {
return type;
}
public String getMessage() {
return message;
}
}

public final class Query<T> extends AsyncTask<Void, Void, String> {

private Clicker<T> onSuccessListener;
private Clicker<QueryError> onErrorListener;

public Query onSuccess(Clicker<T> onSuccessListener) {
this.onSuccessListener = onSuccessListener;
return this;
}

public Query onError(Clicker<QueryError> onErrorListener) {
this.onErrorListener = onErrorListener;
return this;
}

public void call() {
execute();
}

@Override
protected String doInBackground(Void... params) {
return "done";
}
}

onError() 方法调用的问题。

使用匿名类没问题:

enter image description here

但是 lambda 错误类型是对象:

enter image description here enter image description here enter image description here

只有类型转换能帮上忙,但很不舒服:

enter image description here

为什么在 onSuccess() 中来自 lambda 的类型是正确的(在泛型类中定义),而在 onError() 中类型是 Object 而不是 QueryError?也许我做错了什么?

在具有 retrolambda 的 Android Studio 2.3.3 和没有 retrolambda 的 Android Studio 3.0 中相同。

Sample project

最佳答案

您正在调用 onError关于你的 onSuccess 的结果方法,和 onSuccess返回 Query .当您在原始类型上调用方法时,所有类型参数都将被删除,并且任何泛型参数都将替换为其原始类型。因此,您的 lambda 被推断为 Clicker , 这实际上是一个 Clicker<Object>.

更改onSuccess的签名和 onError返回 Query<T> ,还有你的 Clicker<T>应该可以正确推断。

关于java - 使用泛型的 lambda 中的错误类型检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46952630/

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