如何将Scala特征转换为java?

时间:2011-09-05 11:26:33

标签: scala

例如假设我有

abstract class OrderRouter extends Market {
}

我通常会实例化如下

new OrderRouter with NYSE

我如何将上述行翻译成java?纽约证券交易所是延伸市场的特质。

3 个答案:

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