我想在Scala中编写一些这样的Java代码
class A {
def fun1(): this.type = {
this
}
}
class B extends A{
def fun2(): this.type = {
print("b")
this
}
}
object Test{
def main(args: Array[String]): Unit = {
new B().fun1().fun2()
}
}
但是我不能,我认为如果方法的隐式 this 参数可以用于类型推断,我可以像这样写:
class A{
static <T extends A> T fun1(T t) {
return t;
}
}
第一个参数就像非静态方法的第一个隐式 this 参数一样。但这个静态方法不是我想要的。
在没有覆盖儿童班的情况下有没有这样的写法?
答案 0 :(得分:3)
可悲的是,你不能,因为类型是在运行时用Java处理的,因此不能用于更复杂的东西(比如创建一个新的Instance,Array,检查它是什么类型的,......)
我喜欢使用的方式是:
public abstract class A<T extends A> {
public abstract T getType();
}
public class B extends A<B> {
@Override
public B getType() {
return this;
}
}
这可确保您始终拥有最新的&#34;扩展您的主类的类,然后可以用于流水线操作或任何您需要的类。
答案 1 :(得分:0)
这是一个非常有趣的问题,所以我写了这样的东西。我不认为这在现实生活中应用是一种很好的方法,但观看起来很有趣。
public class A<T> {
T fun1(){
return getType();
}
T getType(){
return (T)this;
}
}
class B<T> extends A<T> {
T fun2(){
System.out.println("b");
return getType();
}
}
class C<T> extends B<T> {
T fun3(){
System.out.println("c2");
return getType();
}
}
现在坚持一些事情,因为它变得很奇怪。如果你想链接这些方法,你需要做这样的事情:
new C<C<C<C<C<C>>>>>().fun3().fun1().fun2().fun1().fun2().fun1();
由于类型擦除,最后fun1将返回Object。