red*_*ead 0 java generics lambda java-8
我有一个类似于下面的代码,由于某种原因,当我调用一个Consumer<BigDecimal>带有lambda参数的方法时,lambda参数是类型Object而不是BigDecimal.如果BigDecimal调用lambda param的任何方法,则会导致lambda 中的"无法解析方法" .只有当采用消费者的方法属于泛型类时,才会发生这种情况,但非泛型参与者采用这种消费者方法.
public class Creator<T> {
private T something;
private Consumer<BigDecimal> consumer;
public Creator(T something) {
this.something = something;
}
public void create(Consumer<BigDecimal> consumer) {
this.consumer = consumer;
}
}
public class Processor {
public void process(Creator creator) {
creator.create(big -> big.abs());
^^^^^-------------------- Cannot resolve method
}
}
Run Code Online (Sandbox Code Playgroud)
如果我<T>从Creator类中删除泛型参数,它就可以工作,即使泛型不接触该create()方法
这有什么问题?
public void process(Creator creator) {
Run Code Online (Sandbox Code Playgroud)
在这一行中,您使用Creator原始类型,它基本上破坏了类型推断.
写,至少,
public void process(Creator<?> creator) {
Run Code Online (Sandbox Code Playgroud)
正如Louis Wasserman已经告诉过你正在通过写作删除类型推断
public void process(Creator creator) {
Run Code Online (Sandbox Code Playgroud)
除了路易斯给你的解决方案,你也可以写它
public <T> void process(Creator<T> creator) {
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以在方法进程()中使用T用于其他目的