例如假设我有
abstract class OrderRouter extends Market {
}
我通常会实例化如下
new OrderRouter with NYSE
我如何将上述行翻译成java?纽约证券交易所是延伸市场的特质。
答案 0 :(得分:9)
查看问题How are Scala traits compiled into Java bytecode?和接受的答案。
总结是,假设NYSE有getOrderBook()
方法,Java版本看起来像:
new OrderRouter() {
public OrderBook getOrderBook() {
return NYSE$class.getOrderBook();
}
}
Scala编译器为合成类生成字节码,它通过组合/包装混合在所有特征实现中。由于javac
没有此功能,您需要自己将特征方法委托给特征的单例对象。
答案 1 :(得分: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());
答案 2 :(得分: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 ...
};