Java 泛型优先于混淆
我的班级结构如下Java 泛型优先于混淆,java,generics,overriding,Java,Generics,Overriding,我的班级结构如下 public abstract class X { } public class Y extends X { } 我想做以下几点: public abstract class Action { public abstract <T extends X> void execute(T t); } public class SomeAction extends Action { public void execute(Y y) { } } 公共抽象集体诉讼
public abstract class X { }
public class Y extends X { }
我想做以下几点:
public abstract class Action {
public abstract <T extends X> void execute(T t);
}
public class SomeAction extends Action {
public void execute(Y y) { }
}
公共抽象集体诉讼{
公开摘要无效执行(T);
}
公共集体诉讼延伸了诉讼{
公共无效执行(Y){}
}
编译器给了我以下错误:
类型SomeAction
必须实现继承的抽象方法Action.execute(T)
我确实希望重写execute()
,但我希望参数是X
的子类
我在这里做错了什么?public void execute(T);
public <T extends X> void execute(T t);
是一个抽象的方法,因为它没有任何主体。它应该被标记为抽象的
因此,在您的子类中,您需要重写该类或将方法和子类都标记为抽象类。public void execute(T);
是一个抽象的方法,因为它没有任何主体。它应该被标记为抽象的
因此,在您的子类中,您需要重写该类,或者将方法和子类都标记为抽象类。尝试将类
操作
设置为泛型,而不是其方法之一
public abstract class Action<T extends X>
{
public abstract void execute(T t);
}
尝试将类
Action
设置为泛型,而不是其方法之一
public abstract class Action<T extends X>
{
public abstract void execute(T t);
}
听起来您希望
T extends X
成为类extendingAction
的属性,而不是方法调用。你应该写
public abstract class Action<T extends X> {
public abstract void execute(T t);
}
公共抽象集体诉讼{
公开摘要无效执行(T);
}
然后
public class SomeAction extends Action<Y> {
...
}
public类SomeAction扩展了Action{
...
}
听起来您希望T extends X
成为类extendingAction
的属性,而不是方法调用。你应该写
public abstract class Action<T extends X> {
public abstract void execute(T t);
}
公共抽象集体诉讼{
公开摘要无效执行(T);
}
然后
public class SomeAction extends Action<Y> {
...
}
public类SomeAction扩展了Action{
...
}
您正在打破Liskov原则:基本操作的执行
方法能够执行任何类型的X。但是在子类中,您将其限制为仅执行Y个实例。这是在减少契约,而不是扩展契约。您正在打破Liskov原则:基本操作的execute
方法能够执行任何类型的X。但是在子类中,您将其限制为仅执行Y个实例。这是减少合同,而不是延长合同。那又怎样?它仍然通过其公共方法定义契约,并且所有实现都必须遵守契约。Action类中的泛型方法涉及使用类型调用它并让它返回相同的类型。它与重写方法无关。正如@JBNizet所解释的,重写必须与父级中方法的签名相匹配。。。包括它的一般方面。非常感谢您的讨论。我最初的问题是我想要有多个动作,但每个动作都有不同的参数。有什么好办法来处理它吗?如果你愿意,我可以再问一个问题。那又怎样?它仍然通过其公共方法定义契约,并且所有实现都必须遵守契约。Action类中的泛型方法涉及使用类型调用它并让它返回相同的类型。它与重写方法无关。正如@JBNizet所解释的,重写必须与父级中方法的签名相匹配。。。包括它的一般方面。非常感谢您的讨论。我最初的问题是我想要有多个动作,但每个动作都有不同的参数。有什么好办法来处理它吗?如果你愿意,我可以再问一个问题。