将Java与Scala集成:从Scala类扩展

时间:2012-04-05 22:31:23

标签: java scala abstract-class extends

我创建了一个使用scala的项目,该scala具有一些抽象类定义,例如:

abstract class A(n: String) {
    require(n!= null)
    val name = n

    var inputs: List[Input[_]]
    var outputs: List[Output[_]]
}

abstract class B(n: String) extends A(n){  
   def act
   def isValid : Boolean
   def getCs : List[C[_]]
}

abstract class C[Type]{
   var value: Type 
}

现在我想在Java中使用该项目。我在一个新项目中导入了scala lib,并在构建路径中添加了scala项目。我正在使用eclipse。

然而,当我尝试这样做时:

public class CoolClass extends B {  
    public CoolClass(){ }   
}

修改

我在Java中使用它时遇到了一些问题,这让我有些疑惑。让我列举一下:

  1. 我可以使用Scala中的列表还是Java中的错误?
  2. 为什么在Java中扩展B的类中无法识别来自A的变量?
  3. 如何声明getCs以便它提供与List<C>而非List<C<?>>的界面?

2 个答案:

答案 0 :(得分:7)

我只是假设您已经在java class B中实现了在class CoolClass中定义的所有方法。这里缺少的是调用B的构造函数,正如错误消息所示。

class CoolClass extends B {
  public CoolClass() {
    super("");
  }
  // methods implementations
}

class B上没有定义默认构造函数,因此您必须显式调用已定义的构造函数,即B(n: String)

编辑:

1:你可以在双方都使用任何你想要的东西。虽然方法名称在某些特殊情况下可能会有所不同,例如scala中包含特殊字符的任何内容。

2:虽然它们不是字段,但它们是公认的,但它们是java代码中的方法。您可以使用this.inputs()this.outputs()

访问它们

3:尝试def getCs[C]: List[C]

答案 1 :(得分:1)

你的B课基本上和你描述的一样:

public abstract class B extends A {  
  public B(String n) {
    super(n);
  }

  public abstract void act()
  public abstract boolean isValid();
  public abstract List<C<?>> getCs();
}

您的CoolClass缺少构造函数中的显式超级调用:

public CoolClass extends B {
  public CoolClass() { // override ctor with no string parameter
    super("defaultStringValue");
  }

  public CoolClass(String n) { // override ctor with no string parameter
    super(n);
  }
  …

正如你所看到的,Scala使声明和调用构造函数变得如此微不足道,我们忘记了他们在Java中添加了多少样板文件。