gpt4 book ai didi

java - 为什么泛型参数 "extends"在派生函数中不允许,但泛型返回类型是?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:42:28 27 4
gpt4 key购买 nike

我想重写子类中的泛型函数,如下:

父类(super class):

public abstract class Metric {

public abstract <T extends Foo> T precompute(); // valid syntax
public abstract <T extends Foo> void distance(T arg); // valid syntax
public static class Foo {}

}

子类:

public class MetricDefault extends Metric {

@Override
public Bar precompute() { return new Bar(); } // Valid - return type extends Foo

@Override
public void distance(Bar arg) {} // Invalid ??? - argument type extends foo

public static class Bar extends Metric.Foo {}

}

泛型函数,当泛型类型是函数的返回值时,是有效的 Java 代码并成功构建。

仅更改泛型类型的位置 - 使其成为函数的参数,而不是返回类型 - 它会变成无效的 Java 代码。

为什么后一种情况无效?我该怎么做才能实现此功能?

最佳答案

方法声明

public abstract <T extends Foo> void distance(T arg);

表示该方法接受一个T参数,调用者可以决定使用Foo的哪个子类型作为T

方法声明

public abstract <T extends Foo> T precompute();

表示该方法返回一些T类型的对象,调用者可以决定使用Foo的哪个子类型作为T

最后一个方法不能真正实现(除了返回 null),因为你的方法并不知道在这里生成什么对象。

在您的具体类中,您尝试覆盖这些方法 - 据我了解,您不应该被允许同时使用它们,但也许编译器比我更宽松一些。

我认为您真正想要的是 Overbose 发布的内容。

关于java - 为什么泛型参数 "extends"在派生函数中不允许,但泛型返回类型是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6259708/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com