【发布时间】:2018-02-05 19:35:52
【问题描述】:
有什么方法可以使用如下更通用的类型来引用 this::method?
Number method(Integer input){ return 1;}
void test(){
Function<Integer, Number> ref = this::method; //OK
Function<Number, Number> moreGenericRef = this::method // does not compile.
Function<? extends Number, Number> moreGenericRef2 = this::method // does not compile.
}
我希望能够做到以下几点。
Map<String, Function<Number,Number>> maps;
maps.add("method1", this::method)
maps.add("method2", this::method2)
maps.get("methods1").apply(1.2);
maps.get("methods2").apply(1);
函数是适配器,会被Stream
【问题讨论】:
-
没有。您不能将任何
Number传递给期望Integer的方法。 -
真正的错误是你认为你需要这个。您可能想描述您的实际需求,而不是向我们展示XY Problem。
-
@dwong:没错,这就是它应该的样子。如果您“需要访问 Integer.class 中的方法”,那么您实际上并没有拥有
Function<Number, Number>,而且再多的恶作剧也不会改变这一点。 Java 编译器在这里做的是正确的事情。 -
只出现在方法内部没关系。这与 lambdas 无关,真的。您不能通过将任意数字传递给方法来实现采用任意数字的方法。
标签: java generics lambda java-8