【发布时间】:2016-04-13 06:06:25
【问题描述】:
我有一个在特定场景下返回布尔值的通用方法。
我的方法的方法签名是例如
public <T> T get() { return Boolean.true;}
到这里为止,它工作正常,没有编译器错误。 但是,当我尝试在 if 子句中使用相同的内容时,例如
if(get())
然后它返回错误说
类型不匹配:无法从 Object 转换为布尔值
我也怀疑这只发生在 Eclipse 中。这是一个现有代码,我正在尝试在我的工作区中编译它。
请帮忙。
更新:
这篇文章很好地解释了目标类型推断 - https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html
正如下面@Codebender 所解释的,TargetType 推断适用于链式/嵌套方法,尽管它看起来不适用于 if、for、while 等语言结构。 我试着在下面写一个方法 -
public void test(boolean val)
并尝试像这样称呼它
test(get())
而且效果很好。
解决方案:
最后,在这段代码中,我最终添加了像
这样的显式类型转换if((Boolean)get())
它对我有用。
【问题讨论】:
-
get()在这里用作原始类型,因此它确实返回Object。单个Object不代表有效条件。 -
你能分享完整的上下文吗?另外,为什么这个方法需要是通用的?您知道您正在返回一个布尔值,而您的
if语句将其视为布尔值 - 为什么不直接定义它呢? -
这个神奇的
get()方法是如何工作的,它可以返回任何所需类型的值,甚至不知道该类型是什么?这种方法唯一可以返回而不会(正确地)扰乱编译器的是null。 -
如今,您实际上可以在
if语句中使用泛型方法:ideone.com/wdI4KM。但这有意义吗? (可能不是...)如果您确定它返回Boolean,为什么它是通用的? -
正如我所说,它是一个现有的代码,我正在尝试在我的 Eclipse 中编译。 Boolean.TRUE 不是一个实际的语句,周围发生了一堆方法调用,但最终在这种情况下,它返回布尔值。我正在使用 java8 和 eclipse Mars.2