Java通用上界通配符错误



我的域模型中有以下实体:

class Point {
    public String details;
    public Point() {
        details = "empty";
    }
    public Point(String details) {
        this.details = details;
    }
}
class BasicPoint<X, Y> extends Point {
    public X x;
    public Y y;
    public BasicPoint() {}
    public BasicPoint(X x, Y y) {
        this.x = x;
        this.y = y;
    }
}
class Collector<T> {
    T elem;
    public void collect(T elem) {
        this.elem = elem;
    }
}

我想对数据应用操作,并将数据返回为Point或BasicPoint,如上所述,但编译器抱怨以下错误,尽管OUT扩展了Point:

class Operator<OUT extends Point> {
    public Collector<OUT> operate(Collector<OUT> collector) {
        // compile error, collect(OUT) cannot be applied to BasicPoint<Integer, Integer>
        collector.collect(new BasicPoint<Integer, Integer>(1,2));
        return collector;
    }
}

主要方法应该看起来像:

Collector<BasicPoint<Integer, Integer>> c = new Collector<>();
c = new Operator<BasicPoint<Integer, Integer>>().operate(c);
System.out.println(c.elem.getClass() == new BasicPoint<Integer, Integer>().getClass());

您的Operator是通用的,它不能在BasicPoint上应用collect,只能在OUT上应用。你可以让你的Collector摘要:

abstract class Operator<OUT extends Point> {
    abstract Collector <OUT> operate(Collector<OUT> collector);
}

然后BasicPointOperator将包含您想要的实际实现:

class BasicPointOperator extends Operator<BasicPoint<Integer, Integer>> {
    @Override
    Collector<BasicPoint<Integer, Integer>> operate(Collector<BasicPoint<Integer, Integer>> collector) {
        collector.collect(new BasicPoint<Integer, Integer>(1,2));
        return collector;
    }
}

或者PointOperator,这是一种更通用的

class PointOperator extends Operator<Point> {
    @Override
    Collector<Point> operate(Collector<Point> collector) {
        collector.collect(new BasicPoint<Integer, Integer>(1,2));
        return collector;
    }
}

问题是,除非类型参数是反变量的,否则不能将放入中。类似的东西

public Collector<?>  operate(Collector<? super Point> collector) {
    collector.collect(new BasicPoint<Integer, Integer>(1,2));
    collector.collect(new Point());
    return collector;
 }

最新更新