2017-02-06 43 views
2

我想寫一些Java代碼像這樣在斯卡拉罐java的返回類型寫像斯卡拉this.type

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

,但我做不到,我覺得如果一個方法的隱含參數可以被用於類型推斷,我可以寫這樣的:

class A{ 
    static <T extends A> T fun1(T t) { 
     return t; 
    } 
} 

的第一個參數,就像非靜態方法的第一個隱含這個 parameter.but這個靜態方法是不是我想要的。

有沒有辦法像這樣寫,而不會重寫子類?

回答

3

不幸的是,你不能,因爲類型是在Java運行時處理,因此不能用於更復雜的東西(如創建一個新的實例,陣列,檢查它是什麼類型,...)

,我喜歡用的方法是這樣的:

public abstract class A<T extends A> { 
    public abstract T getType(); 
} 

public class B extends A<B> { 
    @Override 
    public B getType() { 
     return this; 
    } 
} 

這將確保你總是有一個擴展,然後可以用於流水線或任何你需要你的主級的「最新」類。

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將返回對象。