Java中用泛型参数(必须是泛型类的扩展)扩展抽象方法

3
假设我有一个通用的构建器类型:
public abstract class Builder<T> {

  public abstract T build();
}

然后是一个 Foo 类和它的构建器,这个构建器继承自 Builder:

public class Foo {
  // stuff
}

public class FooBuilder extends Builder<Foo> {

  public Foo build() {
    return new Foo();
  }
}

我还有一个抽象的、通用的 Handler 类型:

public abstract class Handler<T> {

  public abstract <U extends Builder<T>> void handle(U builder);
}

最后是一个FooHandler:

public class FooHandler extends Handler<Foo> {

  @Override
  public void handle(FooBuilder builder) {
    // do something
  }
}

问题在于FooHandler的handle()方法没有被识别为覆盖Handler的handle()方法:Method does not override method from its superclass。这个问题能否解决?
1个回答

3

将类型参数移动到类级别

abstract class Handler<T, U extends Builder<T>> {
    public abstract void handle(U builder);
}

class FooHandler extends Handler<Foo, FooBuilder> {
    @Override
    public void handle(FooBuilder builder) {
        // do something
    }
}

很好,这个可以工作。现在要弄清楚为什么在重构之后测试失败了...不过,FooHandler现在语义上不仅是Foos的处理程序,而且还是FooBuilders的处理程序,这似乎很奇怪,不是吗? - dysfunction
@dysfunction 不,我不会这么说。它是通过FooBuilderFooHandler - Sotirios Delimanolis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接