if子句和返回布尔值的泛型方法



我有一个通用方法,它在特定场景中返回布尔值。

我的方法的方法签名是例如

public <T> T get() { return Boolean.true;}

到目前为止,它运行良好,没有编译器错误。不过,当我试图在if子句中使用相同的语句时,比如

if(get())

然后它返回错误,说

类型不匹配:无法从Object转换为布尔

我也怀疑这种情况只会发生在日食中。这是一个现有的代码,我正试图在我的工作区中编译它。

请帮忙。

更新:

本文很好地解释了目标类型推理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())

它对我有效。

要做到这一点:

 if(get())

您需要一个类似返回类型的get方法的布尔值,如下所示:

  public <T> boolean get() {...

代码在Java 8中运行良好(因为广义类型推理)。。。但在Java 7及更低版本中则不然。

看看我的这个答案,就知道什么是广义类型推理:https://stackoverflow.com/a/32294457/2775450以及:https://stackoverflow.com/a/28474319/2775450

除此之外,您的代码似乎还有其他错误,比如它是Boolean.TRUE而不是Boolean.true,并且您应该在return语句中显式转换为T

I think this is happening because if you see in the method signature 
public <T> T get(), you are making it Generics but in the return statement, boolean value is returned. So to make it work just try to change the return type in the method signature like below:- 
public static <T> Boolean get() { 
        return Boolean.TRUE;
}
then use it in the if condition :- if(get()){   }

为什么不将方法定义为

public <T> boolean get() { return Boolean.TRUE;}

在这种情况下,您不会得到编译错误,而是按原样定义返回参数。在原始定义中,您希望该方法返回T而不是boolean类型的内容。

更新:您的代码不使用泛型。而且,没有一种方法可以在计划使用的if语句中使用泛型返回值,因为Java不像脚本语言(例如Python)那样具有"falsy"值。这里有一个通用方法的替代方案是添加一些通用值作为参数,并在方法体中使用它:

public <T> boolean get(T some value) { return Boolean.TRUE;}

但是,如果你想在if中使用结果,那么可以考虑添加这样的东西:

if(get() != null) {...}

它也将采用通用方法。如果您总是从get()返回boolean值,则不需要使用泛型。

最新更新