繁体   English   中英

不兼容的通用返回类型

[英]incompatible generic return type

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

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

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

我认为通过将返回类型设置为T我将能够返回任何类型的Object或类型为StringInteger的超类型。 但是,此代码给出了以下错误消息。

不兼容的类型: java.lang.Object无法转换为T

我在这里俯瞰什么?

该代码无法编译,因为在编译时决定的T是否需要匹配getValue将返回的内容,这在运行时确定,而不受任何限制。

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

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

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

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

C。 使用户有机会提供转换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()));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM