当前位置: 首页 > 知识库问答 >
问题:

保证Java中泛型的协变返回类型

乐正宜人
2023-03-14
public class Point {
    public Point[] neighbors() { /* implementation not shown */ }
}
public class SpecialPoint extends Point {
    public SpecialPoint[] neighbors() { /* implementation not shown */ }
}
java prettyprint-override">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(),以便我可以将它与泛型一起使用?

共有1个答案

司寇苗宣
2023-03-14

您可以使用一个接口:

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() { /* ... */ }
}

然后:

public <P extends Point<P>> P doStuff(P point) {
    P[] neighbors = point.neighbors();
    /* ... */
}

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

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> { /* ... */ }
 类似资料:
  • 本文向大家介绍Java中的协变返回类型,包括了Java中的协变返回类型的使用技巧和注意事项,需要的朋友参考一下 协变返回类型是指重写方法的返回类型。它允许缩小重写方法的返回类型,而无需强制转换类型或检查返回类型。协变返回类型仅适用于非原始返回类型。 从Java 5开始,仅通过遵守返回类型是重写的方法返回类型的子类的条件,就可以通过更改其返回类型来覆盖方法。 示例 以下示例展示了相同的内容。 输出结

  • 问题内容: Java中的协变返回类型是什么?在一般的面向对象编程中? 问题答案: 协变返回,意味着当一个方法被覆盖时,覆盖方法的返回类型被允许为覆盖方法的返回类型的子类型。 为了举例说明,通常情况是-声明为返回类型。你可以在自己的类中重写此方法,如下所示: 这样做的好处是,任何持有对MyFoo对象的显式引用的方法都将能够调用clone()并知道(无需强制转换)返回值是的实例。如果没有协变量返回类型

  • 我为协变返回类型的继承创建了一个小示例。基本上有三种不同的类别: 主应用程序: BaseManager: 鸟经理: 当我重写方法以返回时,为什么我需要将类型转换为? 我使用过的重写方法在返回类型上会有所不同吗?作为参考。 编辑: 我有不同的子模型,它们都继承自。所有模型都允许存在一次。我尝试将这些模型添加到列表中,而不是对每个模型使用单例。使用,我想得到实际的模型。也许我得考虑太多了。

  • 我试图创建一个Java方法,它接受一个对象类型和它应该转换成的数据类型。 例如,如果我应该能够返回一个值1作为Int或双根据需要。我使用类传递数据类型作为参数。 问题:如何使方法泛型以接受基于输入参数的返回类型? 下面的代码只是一个示例,它可能在语法上不正确,用于解释我的问题。

  • 问题内容: 背景 我曾经写过这种方法: 应该这样称呼它: 这很好用(尽管我在研究当前容易出错的问题时在这里的答案中已经看到)。 目前的情况 无论如何,现在我正在编写以下代码(在扩展javax.servlet.jsp.tagext.TagSupport的类中): 目的是可以这样称呼: 我的评估方法中的代码显然不起作用。的第二个参数应该是Class对象。这导致我: 我的问题 如何获得通用(返回)类型的

  • 我在我的Java程序中写了这个函数: 这就是我所说的: 它是有效的,但我觉得我应该能够省略第一个参数,并从返回类型(结果被分配到的类型)推断出它。这可能吗?如果是,语法是什么?