Java返回扩展接口的泛型类型

时间:2014-12-29 12:47:38

标签: java

我遇到了这个问题:

public interface Node {
    public<T extends Node> T copy();
}

public class Point2D implements Node {
    @Override
    public <T extends Node> Point2D copy() {
        return new Point2D(this);
    }
}

为什么我会The return type is incompatible with Node.copy()? Point2D实现Node,如何让错误消失保持返回的类型? 如果我把T替换为Point2D copy()我得到“类型不匹配:无法从Point2D转换为T”这是愚蠢的,因为T被定义为扩展Point2D的类

由于

2 个答案:

答案 0 :(得分:0)

您不需要{child} <T extends Node>子级别的T声明 简单地使用

public class Point2D implements Node {
    @Override
    public Point2D copy() {
        return new Point2D(this);
    }
}

答案 1 :(得分:0)

在这种情况下,您不需要使用类型变量。 Java允许您在重写方法中专门化返回类型。也就是说,以下工作:

public interface Node {
    public Node copy();
}

public class Point2D implements Node {
    @Override
    public Point2D copy() {
        return new Point2D(this);
    } 
}

这可行的原因是Node接口指定copy()方法返回Node实例。类Point2D的{​​{1}}方法确实返回copy()的实例;实际上,它返回子类型Node的实例。