使用泛型类时lambda使用者参数的未知类型

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()方法

这有什么问题?

Lou*_*man 8

public void process(Creator creator) {
Run Code Online (Sandbox Code Playgroud)

在这一行中,您使用Creator原始类型,它基本上破坏了类型推断.

写,至少,

public void process(Creator<?> creator) {
Run Code Online (Sandbox Code Playgroud)

  • @redhead:存在与for-Generics代码兼容的原始类型,并且总是完全关闭通用操作*.因此,即使`create'的泛型参数类型与类'参数无关,在原始类型上调用此方法,关闭泛型操作,也会像调用带有'create(Consumer)`签名的方法一样 - 泛型时代. (2认同)

Nar*_*shi 5

正如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用于其他目的