Java通用上限通配符错误

标签 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;
    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;
    }
}

关于Java通用上限通配符错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37206564/

相关文章:

java - 健康端点仅显示 "status: up"并且不显示敏感信息

java - 使用 iText 打开 PDF 时自动打开打印对话框

java - 简单的 Java 代理服务器 - 谷歌搜索错误

java 。反序列化 Java 通用对象的最佳过程?

java - 从泛型类返回一个数组。如何在 main 方法中打印数组中的数据?

class - 为 sort.data.frame 创建通用/方法一致性的最佳方法?

java - 比较方法和泛型

java - 如何正确调整工具提示的大小和换行

java - 为什么编译器会对待 List<?> 和 List<?以不同方式扩展 Object>?

java - 如何使用 SimpleXml 将 xml 反序列化为自定义属性(及其值)的映射?