具有泛型类型的 Java 8 方法引用

标签 java generics lambda java-8

我在使用 Java 8 方法引用和泛型类型时遇到问题。我已经简化了我的问题,以明确问题所在。以下代码失败:

public static void main(String[] args) {
    new Mapper(TestEvent::setId);
}

private static class Mapper<T> {
    private BiConsumer<TestEvent, T> setter;
    private Mapper(BiConsumer<TestEvent, T> setter) { this.setter = setter; }
}

private static class TestEvent {
    public void setId(Long id) { }
}

但是如果我将构造函数调用更改为

    BiConsumer<TestEvent, Long> consumer = TestEvent::setId;
    new Mapper(consumer);

一切正常。谁能解释一下为什么?

我知道如果我删除泛型类型 (T) 并改用 Long 会奏效,但在解决我的实际问题时这不会奏效。

最佳答案

目前您正在尝试使用 raw 映射器类型,它会删除​​所有类型的内容。

一旦您开始使用泛型类型,一切都很好 - 类型推断可以帮助您:

new Mapper<>(TestEvent::setId);

添加<>是编译代码所需的全部

关于具有泛型类型的 Java 8 方法引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22717234/

相关文章:

java - JScrollBar 中“工作”区域的大小

java - 使用 Jscience 计算 n 个单位的价格(提供单价和数量)

c# - "Nullable object must have a value"在非原始/非结构对象上检查 null 后出现异常

c# - 如何重构linq表达式树

c++ - 局部静态函数对象的初始化是线程安全的吗?

windows - 访问控制异常 : access denied - FilePermission

java - For 循环向后递增数组

java格式带有T字符的特定日期

java - 为什么 T 在 Collections.max() 签名中受 Object 限制?

c# - 将泛型类型隐式转换为非泛型等价物