簡體   English   中英

Java返回類型可以像Scala this.type這樣寫嗎

[英]can java return type write like Scala this.type

我想在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;
    }
}

第一個參數就像非靜態方法的第一個隱式參數一樣。但是這個靜態方法不是我想要的。

有什么辦法可以這樣寫而不覆蓋子類嗎?

遺憾的是,您不能這樣做,因為類型是在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;
    }
}

這樣可確保您始終擁有擴展主類的“最新”類,該類隨后可用於流水線處理或任何您需要的操作。

這是一個非常有趣的問題,所以我寫了這樣的東西。 我認為這絕對不是在現實生活中使用的好方法,但是看起來很有趣。

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();

由於類型擦除,last fun1將返回Object。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM