0

我创建了一个使用 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 项目。我正在使用日食。

但是,当我尝试这样做时:

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

编辑:

我在 Java 中使用它时遇到了一些问题,这让我产生了一些疑问。让我列举它们:

  1. 我可以使用 Scala 中的列表还是在 Java 中出现错误?
  2. 为什么在 Java 中扩展 B 的类中不能识别来自 A 的变量?
  3. 我怎样才能声明getCs它提供一个接口List<C>而不是List<C<?>>
4

2 回答 2

7

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

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]

于 2012-04-05T22:47:30.730 回答
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 中添加了多少样板。

于 2012-04-06T02:52:30.270 回答