当您采用流畅的方法时,您可能会遇到以下情况:
public class Foo<T extends a>{
public Foo<T> someMethod(){
System.out.println("foo");
return this;
}
}
public class Bar<T extends b> extends Foo<T> {
public Bar<T> barMethod(){
System.out.println("bar");
return this;
}
}
public class a{}
public class b extends a{}
一个流畅的接口的优点是你可以链接方法调用,但是当Bar继承了someMethod()时,返回类型是Foo not Bar会破坏以下链:
new Bar<b>().someMethod().barMethod();
一个答案可能是为每个继承的方法添加@Overrides,这样Bar就有了另外的方法:
@Override
public Bar<T> someMethod(){
System.out.println("foo");
return this;
}
但是在大型类和扩展类层次结构中,这肯定会证明一堆乱码?!是否有适当的返回类型来提供流畅的方法,其中每个继承它的类都将返回其特定类型的对象(以便我们可以链接没有强制转换的方法)?
我试过了:
public <U extends Foo<T>> U someMethod(){
System.out.println("foo");
return this;
}
唉,没有用。我希望有人知道这个问题的简单而优雅的解决方案。该项目很大,因此如果可能,它需要可维护和可扩展。
感谢您在此方案中提供的任何帮助。
答案 0 :(得分:5)
你可以这样做,如果你不介意未经检查的演员:
public class Foo<T, F extends Foo<T, F>> {
public F someMethod() {
System.out.println("foo");
return (F) this; // <--- That's the unchecked cast! Tucked safely away.
}
public static void main(String[] args) {
new Bar<String>().someMethod().barMethod();
}
}
class Bar<T> extends Foo<T, Bar<T>> {
public Bar<T> barMethod() {
System.out.println("bar");
return this;
}
}
就个人而言,我为整个项目全局禁用未经检查的投射警告。
答案 1 :(得分:1)
您可以做的是定义barMethod
方法摘要,现在您可以在Foo
类型上调用它。
public abstract class Foo<T extends a> {
public Foo<T> someMethod() {
System.out.println("foo");
return this;
}
public abstract Foo<T> barMethod();
}
现在您可以轻松致电
new Bar<b>().someMethod().barMethod();