代码之家  ›  专栏  ›  技术社区  ›  ryvantage

如何绕过biconsumer lambda函数中的“object cannot be converted”?

  •  0
  • ryvantage  · 技术社区  · 6 年前

    我有一节课( Filter )有几个变量:

    class Filter {
        Integer intVal;
        Double doubleVal;
        String strVal;
    
        public Integer getIntVal() {
            return intVal;
        }
    
        public void setIntVal(Integer intVal) {
            this.intVal = intVal;
        }
    
        public Double getDoubleVal() {
            return doubleVal;
        }
    
        public void setDoubleVal(Double doubleVal) {
            this.doubleVal = doubleVal;
        }
    
        public String getStrVal() {
            return strVal;
        }
    
        public void setStrVal(String strVal) {
            this.strVal = strVal;
        }
    }
    

    还有一个班级( Handler )需要包含lambda Function BiConsumer 要获取并设置该值:

    class Handler {
        Function<Filter, Object> getter;
        BiConsumer<Filter, Object> setter;
        public Handler(Function<Filter, Object> getter, BiConsumer<Filter, Object> setter) {
            this.getter = getter;
            this.setter = setter;
        }
    }
    

    (我用过 双吸收器 因此,答案是: https://stackoverflow.com/a/27759997/963076 )

    实现方式如下:

    Filter filter = new Filter();
    
    Handler handler1 = new Handler(Filter::getIntVal, Filter::setIntVal);
    Object o = handler1.getter.apply(filter);
    handler1.setter.accept(filter, o);
    Handler handler2 = new Handler(Filter::getDoubleVal, Filter::setDoubleVal);
    Handler handler3 = new Handler(Filter::getStrVal, Filter::setStrVal);
    

    但是设定器不起作用。编译器引发错误:

    error: incompatible types: invalid method reference
    Handler handler1 = new Handler(Filter::getIntVal, Filter::setIntVal);
    incompatible types: Object cannot be converted to Integer
    
    error: incompatible types: invalid method reference
    Handler handler2 = new Handler(Filter::getDoubleVal, Filter::setDoubleVal);
    incompatible types: Object cannot be converted to Double
    
    error: incompatible types: invalid method reference
    Handler handler3 = new Handler(Filter::getStrVal, Filter::setStrVal);
    incompatible types: Object cannot be converted to String
    

    所以 双吸收器 无法强制铸造 Object String ,等等。那我该怎么解决这个问题呢?如何编写此命令,以便可以设置 过滤器 有lambda函数吗?

    很肯定答案与泛型有关,我有时很难理解泛型。

    1 回复  |  直到 6 年前
        1
  •  3
  •   gagan singh    6 年前

    使处理程序通用

    class Handler<E> {
        Function<Filter, E> getter;
        BiConsumer<Filter, E> setter;
        public Handler(Function<Filter, E> getter, BiConsumer<Filter, E> setter) {
            this.getter = getter;
            this.setter = setter;
        }
    }
    

    下面是示例用法

        Handler<Integer> handler1 = new Handler<>(Filter::getIntVal, Filter::setIntVal);
        Integer i1 = handler1.getter.apply(filter);
        handler1.setter.accept(filter, i1);