gpt4 book ai didi

java - 不兼容的泛型返回类型

转载 作者:搜寻专家 更新时间:2023-11-01 03:17:42 24 4
gpt4 key购买 nike

我对泛型很了解,但是遇到了一个看似简单的问题,但我不太明白。看看下面的例子。

public <T extends Object> T getSetting(String settingName) {
return settings.getJsonObject(settingName).getValue("value");
}

settingsvertx.core.json.JsonObject 类型的实例属性。 getValue 的结果是 Object

我认为通过将返回类型设置为 T 我将能够返回任何 Object 类型或像 String 这样的父类(super class)型或 整数。然而,这段代码给了我以下错误信息。

incompatible types: java.lang.Object cannot be converted to T

我在这里忽略了什么?

最佳答案

该代码无法编译,因为无论 T 是什么,在编译时决定,都不需要匹配 getValue 将返回的内容,后者在运行时确定完全不受限制。

您可以添加一个 (T) 强制转换,这会在警告中转换错误,但这不会阻止潜在的运行时强制转换错误,这就是它保留为警告的原因。

我认为这没有任何真正的解决方法,因为您永远无法确定 getValue 返回的类型……但是您可以提供一些方法,至少可以:

一个。更优雅地失败(带有更好的错误消息),

如果类型不是预期的类型,则返回默认值,

给用户提供转换 lambda 的机会 任何可能的输入类型到预期的返回值类。

例如

public <T> T getSetting(String settingName, Class<T> clazz) {
final Object obj = settings.getJsonObject(settingName).getValue("value");
if (obj == null)
return null;
else if (!clazz.isInstance(obj))
throw new IllegalArgumentException(String.format("wrong setting class; was expecting %s but found %s", clazz.getSimpleName(), obj.getClass().getName());
else {
return clazz.cast(obj);
}
}
...
Integer x = getSetting("mysetting", Integer.class);

或者:

public <T> T getSetting(String settingName, Function<Object, T> cast) {
final Object obj = settings.getJsonObject(settingName).getValue("value");
return obj == null ? null : cast.apply(obj);
}
...
Integer x = getSetting("mysetting", o -> Integer.parseInt(o.toString()));

关于java - 不兼容的泛型返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42807455/

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