繁体   English   中英

泛型问题

[英]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
}

换句话说,将来,我可能会有ShapeAction的子类在它们上进行操作,例如:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM