我有这个:
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
)?
2条答案
按热度按时间piah890a1#
不可能-参数是
Function<Integer, String>
.getMethods[0]
不起作用。例如:这会回来的
void
在这里。一般来说,不需要运行时检查-泛型负责:
上面的内容甚至不能编译。
要对实际代码进行深入研究,这完全不起作用:
泛型被删除,这主要意味着泛型通常是编译器想象的虚构。在运行时,信息就消失了。这并不总是正确的,但是它通常是正确的,或者可以总是正确的,所以您想要的(运行时检查)是不可能保证的。
另外,你把支票弄乱了。
isInstance
做什么instanceof
does:它需要一个类型和一些对象。你有两个例子Class<?>
; 正确的方法是isAssignableFrom
,不是isInstance
. 正如你所发现的,它不起作用,也不能起作用——这就是擦除。kkbh8khc2#
一些
Function
子类将提供apply
方法具有协变返回类型和一个用于跨其转发调用的合成桥。然而,Function
示例通常是lambda或函数引用,因此不会。作为反例,考虑以下方法。
这个
Function
此方法返回的将始终是同一类,但是T
可能会改变。因此类不能引用类型。这样做的一个好处是,函数对象不需要携带额外的数据来表示类型参数,这在类型安全代码中是没有用的。