[英]Generics question
假设我有:
public interface Action<S extends Shape> {
public void start( S shape );
}
为什么会出现以下情况?
public <S extends Shape> void performAction( Action<S> action, Shape shape ) {
action.start(shape); // error: cannot supply Shape
}
换句话说,将来,我可能会有Shape
和Action
的子类在它们上进行操作,例如:
Action<Rectangle>
Action<Blob>
我想有一个统一的接口,可以将Action
应用于Shape
许多不同子类。
我认为您需要这样的东西:
public <S extends Shape> void performAction(Action<S> action, S shape) {
action.start(shape);
}
但是,在这种情况下,如果您只对Shape
及其子类感兴趣,则不清楚使用泛型有什么价值。 下面的代码将完成相同的操作。
public interface Action {
public void start(Shape someShape);
}
public void performAction(Action action, Shape someShape) {
action.start(someShape);
}
但是,如果Action
类是完全通用的并且可以与Shape
及其子类以外的对象一起使用,则可以执行以下操作:
public interface Action<S> {
public void start(S target);
}
public <S> void performAction(Action<S> action, S target) {
action.start(target);
}
在这种情况下,我认为您不一定需要泛型。 这是我会做的:
public interface Action {
public void start( Shape someShape );
}
public void performAction( Action action, Shape someShape ) {
action.start(someShape);
}
然后,您可以将任何扩展Shape
类型传递给start()
方法。
start
的签名需要一个S
,但是您要传递给它一个Shape
。
因为动作是针对形状的特殊化,而不是任何形状。
对于基本需求,我建议:
public interface Action {
public void start(Shape shape );
}
或者,如果您需要更强地键入它们,则可以更改另一个:
public <S extends Shape> void performAction( Action<S> action, S shape ) {
action.start(shape);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.