gpt4 book ai didi

java - 为什么没有办法让接口(interface)要求实现类来引用它们自己的类型?

转载 作者:行者123 更新时间:2023-11-29 04:50:30 25 4
gpt4 key购买 nike

类似Comparable<> 的接口(interface)使用泛型来确定一个类可以与哪种类型进行比较。在某些情况下,将一个类与另一个类进行比较可能是有意义的,例如 A implements Comparable<B> .但是我现在正在处理一种情况,我希望接口(interface)指定返回类型始终与实现接口(interface)的类型相同。也就是说A.get()的类型应始终为 A .

我最初强制自引用的尝试是这样的:

interface Property<T extends Property<T>> {
public T get();
}

这允许

class A implements Property<A> {
public A get() { ... }
}

同时防止类似的事情

class A implements Property<B> {
public B get() { ... }
}

不幸的是,它允许编译以下内容:

class A implements Property<A> {
public A get() { ... }
}
class B implements Property<A> {
public A get() { ... }
}

有办法吗?

最佳答案

不,没有办法强制子类根据 Curiously Recurring Template Pattern 的泛型类型参数缩小继承方法的返回类型。 .您不能强制 Bget() 返回 B。子类可以在不改变方法的情况下继承方法,这是一个面向对象的原则。

有时我希望有这个功能——一种通用的“与 self 的关系”类型。这是我的语法。关键字“this”将表示此类型 - A 中的 AB 中的 B

public class A {
public this get() {
return this; // Or another instance of this type
}
}
public class B extends A {
// "this" on get in A forces B to override "get"
// to narrow the return type
@Override
public this get() {
return this;
}
}

但是强制 B 覆盖 getA() 违背了面向对象的原则。子类应该可以按原样自由地从父类(super class)继承方法。

关于java - 为什么没有办法让接口(interface)要求实现类来引用它们自己的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35587188/

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