如何将Scala特性转换为java?

如何将Scala特性转换为java?,scala,Scala,例如,假设我有 abstract class OrderRouter extends Market { } 我通常会实例化如下 new OrderRouter with NYSE 我将如何将上面的行翻译成java?纽约证券交易所是一种拓展市场的特质。你必须使用组合: class NYSE implements Market { void methodA() { //implementation } } interface Market { void

例如,假设我有

abstract class OrderRouter extends Market {
}
我通常会实例化如下

new OrderRouter with NYSE

我将如何将上面的行翻译成java?纽约证券交易所是一种拓展市场的特质。

你必须使用组合:

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生成的类文件

traits没有直接翻译成java。即使scala编译器基本上也会将代码从trait复制到具体的类,您也必须这样做:

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 ...
};

看一看问题和公认的答案

总结是,假设NYSE有一个
getOrderBook()
方法,Java版本如下所示:

new OrderRouter() {
    public OrderBook getOrderBook() {
        return NYSE$class.getOrderBook();
    }
}
Scala编译器为合成类生成字节码,这些合成类通过组合/包装混合在所有trait实现中。由于
javac
没有这个特性,您需要自己将trait方法的委托连接到trait的单例对象