Java 有没有办法在超类中定义泛型方法来引用继承类';s型?
定义类似此方法的内容时:Java 有没有办法在超类中定义泛型方法来引用继承类';s型?,java,generics,Java,Generics,定义类似此方法的内容时: class State { public void addOperator(Operator<? extends State> op) { } } 类状态{ public void addOperator(Operator由于包含多态性,可以随时使用子类代替超类。由于包含多态性,可以随时使用子类代替超类。尝试编写 State.class 获取状态的类对象 class State { public void addOperator(Oper
class State {
public void addOperator(Operator<? extends State> op) {
}
}
类状态{
public void addOperator(Operator由于包含多态性,可以随时使用子类代替超类。由于包含多态性,可以随时使用子类代替超类。尝试编写
State.class
获取状态的类对象
class State {
public void addOperator(Operator<? extends State.class> op) {
}
}
试着写
State.class
获取状态的类对象
class State {
public void addOperator(Operator<? extends State.class> op) {
}
}
你已经接受了一个答案,声称你想要的约束不能用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>() { /* ... */ });
}
}
在这里,可以使用操作符调用另一个派生状态#addOperator()
,该操作符显然不是操作符类型
您无法阻止某人从状态
“错误”派生,但如果您假设人们将遵循预期的派生模式,您可以帮助他们安全地使用库的其余部分。您已经接受了一个答案,声称您所需的约束不能用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>() { /* ... */ });
}
}
在这里,可以使用操作符调用另一个派生状态#addOperator()
,该操作符显然不是操作符类型
您无法阻止某人从状态
“错误”派生,但如果您假设人们将遵循预期的派生模式,您可以帮助他们安全地使用库的其余部分。运算符的错误是什么?Java不支持self类型。这不是错误,而是缩小方法在编译时接受的对象类型。否则,我没有o使用内部if检查来验证传递的值是否真的符合我的期望值。好的,谢谢你,不妨回答一下,这样我就可以检查一下operator有什么问题吗?否,Java不支持self类型。这不是因为它错了,而是因为缩小了方法在co接受的对象类型mpile time。否则,我必须使用内部if检查来验证传递的值是否真的符合我的期望值。好的,谢谢你,不妨做一个答案,这样我就可以选中它不会编译也不会修复我的问题不会编译也不会修复我的问题谢谢,所以它是不可能的,所以对于effor来说它是不可能的t、 我不知道CRTP。看到javas类型系统无法表达这一点有点难过。不客气。这是我几年前在应用CRTP时的另一个答案:。谢谢你的努力,我不知道CRTP。看到javas类型系统无法表达这一点有点难过。不客气。这是另一个答案几年前我的nswer,我在那里也应用了CRTP:。