例如,假設我有如何將Scala特徵轉換爲java?
abstract class OrderRouter extends Market {
}
我通常實例如下
new OrderRouter with NYSE
我將如何翻譯上面的線爲Java?紐約證券交易所是擴大市場的一個特點。
例如,假設我有如何將Scala特徵轉換爲java?
abstract class OrderRouter extends Market {
}
我通常實例如下
new OrderRouter with NYSE
我將如何翻譯上面的線爲Java?紐約證券交易所是擴大市場的一個特點。
看一看問題How are Scala traits compiled into Java bytecode?,以及公認的答案。
摘要是,假設NYSE具有getOrderBook()
的方法,該Java版本將如下所示:
new OrderRouter() {
public OrderBook getOrderBook() {
return NYSE$class.getOrderBook();
}
}
Scala編譯器生成的字節碼合成類,混合在所有的性狀實現通過組合物/包裝。由於javac
沒有此功能,因此您需要將trait方法委託自己連線到trait的單例對象。
你必須使用組成:
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());
我相信從翻譯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 ...
};