例如,假设我有如何将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 ...
};