有没有被设置,将持有的Java类不分类型所有可能的二传手引用类型?

问题描述 投票:4回答:2

假设我们有一个非常简单的类:

public class User {

    private Long id;
    private String name;

    public void setId(Long id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

}

我做一个简单的粘合剂类来填充用户,并希望信号所需的性能。

UserBinder binder = new UserBinder(user)
    .requires(User::setId)
    .requires(User::setName);

上述发出信号,这两个特性是必需的。当然,我可以通过值"id""name"代替方法引用。但似乎传递二传手,因为这需要二传手粘结剂内被称为是非常合适的。

下面的伟大工程:

public void requires(BiConsumer<User, Long> r) // for User::setId;
public void requires(BiConsumer<User, String> r) // for User::setName;

但以下故障:

public void requires(BiConsumer<User, ?> r)

有没有被设置,将持有的Java类不分类型所有可能的二传手引用类型?

java generics lambda
2个回答
2
投票

您可以添加一个泛型参数的方法requires

public <T> void requires(BiConsumer<User, T> consumer)

现在这个:

new UserBinder(new User())
    .requires(User::setName);

编译罚款。


你告诉你需要将接收到的消费者存储一些收集和检查收集已经包含了一些consumer

不幸的是,你不能轻易地做到这一点(见本question)。

作为一种变通方法,您可以创建作为@FunctionalInterface Serializable用同样的方法签名延伸的BiConsumer和比较序列化字节。见this answer。但请记住,你不能依赖于这种行为


4
投票

你能不能绑定使用类型:

<T> void requires(BiConsumer<User, T> r) {
}

另外,如果你要强制只是这些参数,你可以创建为必填字段的自定义构造函数:

public User(Long id, String name)

为确保对象的实例化必须具备这些属性。

© www.soinside.com 2019 - 2024. All rights reserved.