Dar*_*ius 5 java inheritance fluent
当您采用流畅的方法时,您可能会遇到以下情况:
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{}
Run Code Online (Sandbox Code Playgroud)
一个流畅的接口的优点是你可以链接方法调用,但是当Bar继承了someMethod()时,返回类型是Foo not Bar会破坏以下链:
new Bar<b>().someMethod().barMethod();
Run Code Online (Sandbox Code Playgroud)
一个答案可能是为每个继承的方法添加@Overrides,这样Bar就有了另外的方法:
@Override
public Bar<T> someMethod(){
System.out.println("foo");
return this;
}
Run Code Online (Sandbox Code Playgroud)
但是在大型类和扩展类层次结构中,这肯定会证明一堆乱码?!是否有适当的返回类型来提供流畅的方法,其中每个继承它的类都将返回其特定类型的对象(这样我们可以链接没有强制转换的方法)?
我试过了:
public <U extends Foo<T>> U someMethod(){
System.out.println("foo");
return this;
}
Run Code Online (Sandbox Code Playgroud)
唉,没有用.我希望有人知道这个问题的简单而优雅的解决方案.该项目很大,因此如果可能,它需要可维护和可扩展.
感谢您在此方案中提供的任何帮助.
你可以这样做,如果你不介意未经检查的演员:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
就个人而言,我为整个项目全局禁用未经检查的投射警告.
| 归档时间: |
|
| 查看次数: |
650 次 |
| 最近记录: |