在功能界面中是否有针对泛型参数的解决方法?

时间:2017-03-11 11:03:44

标签: java generics functional-interface

我试图通过在base - Component类中只创建每种类型的一种方法(update,fetch)来缩短我的数据库访问代码。 要做到这一点,我需要以某种方式存储getter和setter,以便在需要时将它们附加到查询中 - 并且不要使用反射。 所以我带来了这个:

class Component{
    protected final HashMap<String, Pair<Getter,Setter>> FIELDS = new HashMap<>();
    public void updateInDB(){
        // create update query, iterating through FIELDS (getters)
    }
}


public class TestComponent extends Component {

    private String color1;

    protected TestComponent(String user_id) {
        super(user_id);
        FIELDS.put("color1", new Pair<>(this::getColor1, this::setColor1));
    }

    public String getColor1() {
        return color1;
    }

    public void setColor1(String color1) {
        this.color1 = color1;
    }
}

Getter看起来像这样:

public interface Getter<T> {
    T get();
}

设置器:

public interface Setter<T> {
    void set(T value);
}

和Pair类:

public class Pair<A, B> {

    private A first = null;
    private B second = null;

    public Pair(A first, B second) {
        this.first = first;
        this.second = second;
    }

    public A getFirst() {
        return first;
    }

    public void setFirst(A first) {
        this.first = first;
    }

    public B getSecond() {
        return second;
    }

    public void setSecond(B second) {
        this.second = second;
    }

}

错误是: B不是功能接口,这意味着Setter接口不是功能接口。有没有可行的解决方法呢?

1 个答案:

答案 0 :(得分:0)

让我们看看你的Pair<Getter,Setter>。因为您没有参数化您的setter,所以期望接口方法如下所示:

void set (Object value);

但那不是setColor1。它需要String,而不仅仅是任何旧Object

现在为了使其编译,您需要向Setter添加类型参数:

protected final HashMap<String, Pair<Getter<String>,Setter<String>>> FIELDS = new HashMap<>();