2011-09-05 104 views
3

例如,假設我有如何將Scala特徵轉換爲java?

abstract class OrderRouter extends Market { 
} 

我通常實例如下

new OrderRouter with NYSE 

我將如何翻譯上面的線爲Java?紐約證券交易所是擴大市場的一個特點。

回答

9

看一看問題How are Scala traits compiled into Java bytecode?,以及公認的答案。

摘要是,假設NYSE具有getOrderBook()的方法,該Java版本將如下所示:

new OrderRouter() { 
    public OrderBook getOrderBook() { 
     return NYSE$class.getOrderBook(); 
    } 
} 

Scala編譯器生成的字節碼合成類,混合在所有的性狀實現通過組合物/包裝。由於javac沒有此功能,因此您需要將trait方法委託自己連線到trait的單例對象。

1

你必須使用組成:

class NYSE implements Market { 
    void methodA() { 
     //implementation 
    } 
} 

interface Market { 
    void methodA(); 
} 

class OrderRouter implements Market { 

    Market market; 
    OrderRouter(Market m) { 
     this.market = m; 
    } 

    // for each method in market implements it and 
    // redirect the call to this.market 

    public void methodA() { 
     market.methodA(); 
    } 

} 

然後:

OrderRouter or = new OrderRouter(new NYSE()); 
1

我相信從翻譯Scala代碼與Java使用Scala編譯器,並使用所產生的類文件的最佳選擇java的。

沒有將特徵直接翻譯成java。即使是Scala編譯器從性狀的具體類基本上覆制代碼,你就必須做到這一點:

abstract class A { void foo(); } 

/* trait T { 
    void boo() { ... code ... } 
} 
*/ 

// This would be 
// A with T 
class AwithT extends A 
{ 
    // copied from T 
    void boo() { ... code ... } 

    // other definitions ... 
}; 
相關問題