2011-09-05 105 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 ... 
}; 
相关问题