不兼容的通用返回类型

3limin4t0r

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

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

settings是type中的实例属性vertx.core.json.JsonObject的结果getValueObject

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

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

我在这里俯瞰什么?

瓦伦丁·鲁阿诺(Valentin Ruano)

该代码不会编译,因为无论是在编译时确定的T是什么,都不需要匹配getValue将在运行时确定的返回值,而这完全不受限制。

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

我不认为有任何实际的解决方法,因为您永远无法确定getValue返回的类型...但是,您可以提供至少一些方法:

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

b。如果类型不是期望的类型,则返回默认值,

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()));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章