2015-07-12 85 views
2

比方说,我有一个通用的构建器类型:扩展抽象方法与泛型参数(即必须扩展泛型类)在Java中

public abstract class Builder<T> { 

    public abstract T build(); 
} 

然后一个Foo类和它的建设者,它扩展生成器:

public class Foo { 
    // stuff 
} 

public class FooBuilder extends Builder<Foo> { 

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

我也有一个抽象的,一般的处理程序类型:

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():Method does not override method from its superclass。是否有可能做到这一点?

回答

2

移动类型参数到类级

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 
    } 
} 
+0

良好,即工作。现在要弄清楚为什么在这个重构之后测试失败了...... 虽然,看起来奇怪的是,FooHandler现在在语义上是一个Handler而不仅仅是Foos,而是FooBuilders? – dysfunction

+0

@dysfunction Nah,我不会那样说的。这是一个'FooHandler'_through_'FooBuilder's。 –