Java通用上界通配符错误

Java通用上界通配符错误,java,generics,Java,Generics,我的域模型中有以下实体: 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;

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

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;
    }
}
类点{
公共字符串详细信息;
公共点(){
详细信息=“空”;
}
公共点(字符串详细信息){
this.details=详细信息;
}
}
类BasicPoint扩展点{
公共X X;
公共卫生;
公共基本点(){}
公共基本点(X,Y,Y){
这个.x=x;
这个。y=y;
}
}
类收集器{
元素;
公共无效收集(T元素){
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;
    }
}
类运算符{
公共收集器操作(收集器){
//编译错误,无法将collect(OUT)应用于BasicPoint
collector.collect(新的基本点(1,2));
回程收集器;
}
}
主要方法如下所示:

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());
收集器c=新收集器();
c=新操作员()。操作(c);
System.out.println(c.elem.getClass()==newBasicPoint().getClass());

您的
操作符是通用的,它不能在
基本点上应用
收集
,只能应用
输出
。您可以将您的
收集器
抽象化:

abstract class Operator<OUT extends Point> {
    abstract Collector <OUT> operate(Collector<OUT> collector);
}
或者
PointOperator
,它更通用一些

class PointOperator extends Operator<Point> {

    @Override
    Collector<Point> operate(Collector<Point> collector) {
        collector.collect(new BasicPoint<Integer, Integer>(1,2));
        return collector;
    }
}
类点运算符扩展运算符{
@凌驾
收集器操作(收集器){
collector.collect(新的基本点(1,2));
回程收集器;
}
}

问题在于,除非类型参数为,否则无法将内容放入。诸如此类

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

    return collector;
 }

public Collector operate(Collector)您拥有代码,打开IDE并生成输出。问题是代码没有编译,它显示了问题中定义的运算符类上的错误。那么编译器错误是什么?错误在问题://编译错误,collect(OUT)中描述不能应用于BasicPointAfaik它可以按照他最初编程的方式工作,你知道为什么它会工作吗?我猜编译器只是忽略了
操作符内部
OUT
的类型。它不工作,因为
BasicPoint
不是
OUT
类型。它们只是有一个共同的祖先
public Collector<?>  operate(Collector<? super Point> collector) {
    collector.collect(new BasicPoint<Integer, Integer>(1,2));
    collector.collect(new Point());

    return collector;
 }