首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中使用泛型保证协变返回类型

在Java中使用泛型保证协变返回类型
EN

Stack Overflow用户
提问于 2015-04-16 21:56:05
回答 2查看 1.4K关注 0票数 18

我有一个名为Point的类,它有一个返回Point数组的neighbors()方法:

代码语言:javascript
复制
public class Point {
    public Point[] neighbors() { /* implementation not shown */ }
}

我有一个Point的子类,叫做SpecialPoint,它重写neighbors()返回一个SpecialPoint数组而不是Point数组,我认为这叫做协变返回类型。

代码语言:javascript
复制
public class SpecialPoint extends Point {
    public SpecialPoint[] neighbors() { /* implementation not shown */ }
}

在一个单独的类中,我希望通过泛型使用PointSpecialPoint

代码语言:javascript
复制
public <P extends Point> P doStuff(P point) {
    P[] neighbors = point.neighbors();
    // more stuff here including return
}

这不会编译,因为编译器只能保证PPoint的某个子类,但不能保证Point的每个子类都会重写neighbors()以返回自身的数组,就像我对SpecialPoint所做的那样,所以Java只知道P#neighbors()返回Point[],而不是P[]

我如何保证每个子类都用协变返回类型覆盖neighbors(),这样我就可以在泛型中使用它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-16 22:03:14

您可以使用一个接口:

代码语言:javascript
复制
public interface Point<P extends Point<P>> {
    P[] neighbors();
}

public class SimplePoint implements Point<SimplePoint> {
    @Override
    public SimplePoint[] neighbors() { /* ... */ }
}

public class SpecialPoint implements Point<SpecialPoint> {
    @Override
    public SpecialPoint[] neighbors() { /* ... */ }
}

然后:

代码语言:javascript
复制
public <P extends Point<P>> P doStuff(P point) {
    P[] neighbors = point.neighbors();
    /* ... */
}

如果你仍然需要在实现之间分解代码,那么最好使用抽象类:

代码语言:javascript
复制
public abstract class Point<P extends Point<P>> {
    public abstract P[] neighbors();
    public void commonMethod() { /* ... */ }
}

public class SimplePoint extends Point<SimplePoint> { /* ... */ }

public class SpecialPoint extends Point<SpecialPoint> { /* ... */ }
票数 16
EN

Stack Overflow用户

发布于 2015-04-16 22:16:00

interface Point可能会解决您的问题:

代码语言:javascript
复制
public class Test  
{

    public interface Point  {
        public Point[] neighbors();
    }

    public class SpecialPoint implements Point {
        public SpecialPoint[] neighbors() { return null; }
    }

    public class SpecialPoint2  implements Point {
        public SpecialPoint2[] neighbors() { return null; }
    }

    public Point doStuff(SpecialPoint point) {
        Point[] neighbors = point.neighbors();
        return neighbors[0];
    }

    public Point doStuff(SpecialPoint2 point) {
        Point[] neighbors = point.neighbors();
        return neighbors[0];
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29676945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档