检查函数的返回类型

rfbsl7qr  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(247)

我有这个:

class Male extends Person{..}
class Women extends Person{..}

// returns true if the return type of the given function is of type Women
boolean isReturnTypeWomen(Function<Integer, Person> function){

    Class<?> type = function.getClass().getMethods()[0].getReturnType();

    return type.isInstance(Women.class) ? true : false;

}

然而,它总是返回真的,因为 type 总是 Object .
如何检查给定参数的第二个参数(返回类型)的示例类型 Function )?

piah890a

piah890a1#

不可能-参数是 Function<Integer, String> . getMethods[0] 不起作用。例如:

public class Example implements Function<Integer, String> {
    public void completelyUnrelatedMethod() {}
    public String apply(Integer i) { return null; }
}

这会回来的 void 在这里。
一般来说,不需要运行时检查-泛型负责:

Function<Integer, Integer> ohDearThisDoesNotReturnAString = a -> a;
isReturnTypeString(ohDearThisDoesNotReturnAString);

上面的内容甚至不能编译。
要对实际代码进行深入研究,这完全不起作用:
泛型被删除,这主要意味着泛型通常是编译器想象的虚构。在运行时,信息就消失了。这并不总是正确的,但是它通常是正确的,或者可以总是正确的,所以您想要的(运行时检查)是不可能保证的。
另外,你把支票弄乱了。 isInstance 做什么 instanceof does:它需要一个类型和一些对象。你有两个例子 Class<?> ; 正确的方法是 isAssignableFrom ,不是 isInstance . 正如你所发现的,它不起作用,也不能起作用——这就是擦除。

kkbh8khc

kkbh8khc2#

一些 Function 子类将提供 apply 方法具有协变返回类型和一个用于跨其转发调用的合成桥。然而, Function 示例通常是lambda或函数引用,因此不会。
作为反例,考虑以下方法。

public static <T,R> Function<T,R> nothing(Function<T,R> fun) {
    return t -> fun.apply(t);
}

这个 Function 此方法返回的将始终是同一类,但是 T 可能会改变。因此类不能引用类型。
这样做的一个好处是,函数对象不需要携带额外的数据来表示类型参数,这在类型安全代码中是没有用的。

相关问题