gpt4 book ai didi

java - 有没有办法在父类(super class)中定义泛型方法来引用继承类的类型?

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

当定义这样的方法时:

class State {
public void addOperator(Operator<? extends State> op) {
}
}

有没有办法这样定义:

class State {
public void addOperator(Operator<? extends this.getClass()> op) {
}
}

因此任何从 State 继承的类都会强制所有传入的值符合其类类型。

我知道上面的方法行不通,但是有没有强制通用通配符至少匹配当前类类型的方法?

最佳答案

您已经接受了一个声称您想要的约束无法用 Java 表达的答案。如果我正确理解了这些要求,则可以接近以下解决方案。

// You didn't flesh out what an operator does or provides,
// so I'll just make something up.
interface Operator<T> {
void apply(T arg);
}

// Request that a derived type provide its own type as a type
// parameter, per the Curiously Recurring Template Pattern (CRTP).
abstract class State<T extends State> {
public void addOperator(Operator<? extends T> op) {
final PrintStream s = System.out;
s.print("Received an operator of concrete type ");
s.print(op.getClass().getName());
s.println('.');
}
}

final class DerivedState extends State<DerivedState> {
}

public class Driver {
public static void main(String[] args) {
DerivedState ds = new DerivedState();
ds.addOperator(new Operator<DerivedState>() {
// ...
});

// And the following will not compile:
ds.addOperator(new Operator<Integer>() { /* ... */ });
}
}

请注意 DerivedTypeapply()方法将只接受 Operator类型参数为 DerivedType 的参数—或派生自 DerivedType 的某种类型, 但自 DerivedType是最终的,不存在其他此类类型。

我们不能做的事情——这可能正是 Chris 所暗示的——强制要求提供给 State 的类型参数。实际上是派生类型本身。我们无法阻止以下定义,其中一个类提供另一个类作为 State 的类型参数:

final class AnotherDerivedState extends State<DerivedState> {
}

在这里,可以调用 AnotherDerivedState#addOperator()Operator<DerivedState> ,这显然不是 Operator<AnotherDerivedState> 类型.

你不能阻止某人从 State 派生“不正确”,但如果您假设人们会遵循预期的推导模式,您可以帮助他们安全地使用您图书馆的其余部分。

关于java - 有没有办法在父类(super class)中定义泛型方法来引用继承类的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30425028/

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