可以java返回类型写像Scala this.type

时间:2017-02-06 07:08:12

标签: java scala

我想在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 参数一样。但这个静态方法不是我想要的。

在没有覆盖儿童班的情况下有没有这样的写法?

2 个答案:

答案 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。