我创建了一个使用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中使用它时遇到了一些问题,这让我有些疑惑。让我列举一下:
getCs
以便它提供与List<C>
而非List<C<?>>
的界面?答案 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中添加了多少样板文件。