0

Scala 最近让我很头疼,因为我在 Internet 上找不到信息。很难找到信息,因为 Scala 用一组无限的术语定义了他自己的语言(我还不知道)。

我在 StackOverflow 上提出了一些关于 Scala 和 Java 之间转换的问题,在最后一个问题中我说我将放弃这种方法。但是,我想了解正在发生的事情。

想象一个 Scala 类:

abstract class Block(n: String) {

    require(n != null)
    val name = n

    var log: ArrayList[String]
    var inputs: ArrayList[Input[_]]
    var outputs: ArrayList[Output[_]]

    def newValue
}

到目前为止,一切都很好。问题是:

我无法访问类字段(是的,我试过了this.inputs())。可能是因为它是这样翻译的:

public abstract class pt.thesis.tiago.Block 
    extends java.lang.Object implements  scala.ScalaObject{

    public java.lang.String name();
    public abstract java.util.ArrayList log();
    public abstract void log_$eq(java.util.ArrayList);
    public abstract java.util.ArrayList inputs();
    public abstract void inputs_$eq(java.util.ArrayList);
    public abstract java.util.ArrayList outputs();
    public abstract void outputs_$eq(java.util.ArrayList);
    public abstract void newValue();
    public pt.thesis.tiago.Block(java.lang.String);
}

为什么每一件事都是抽象的?我不能像 Java 一样,只有我想要的东西是抽象的吗?

4

2 回答 2

3

关于学习 Scala 的材料,我仅仅阅读了 Martin Odersky(Scala 的创造者)、Lex Spoon 和 Bill Venners 的Programming in Scala就学到了很多东西。此外,在docs.scala-lang.org上有很多很好的信息,还有相当不错的Tour of Scala

关于术语,我不认为 Scala 发明了那么多术语。这些术语可能来自您不熟悉的语言(ErlangHaskellML等)或在其他语言中没有得到大量讨论的概念,例如类型理论

这里的一般原则是 Scala 是一种非常常规的语言。事实上,Martin 想让它更简单、更规则

在 Java 中,只有方法可以是抽象的。在 Scala 中,基本上类的任何成员都可以是抽象的。在 Scala 中,要使项目抽象,您可以省略它的定义。所以该语句var log: ArrayList[String]实际上创建了一个抽象变量,而不是一个用null. 是的,这与您对 Java 的期望不同。但它使 Scala 作为一个整体成为一种更常规的语言。

abstract class Foo {
  type SomeType               // abstract type

  val someVal: SomeType       // abstract val

  var someVar: SomeType       // abstract var

  def someMethod(v: SomeType) // abstract method
}

如果您确实想创建一个初始化为 的字段null,请使用 对其进行初始化_。这将创建具体的变量而不是抽象的变量。

于 2012-04-06T14:27:43.750 回答
3

每件事都不是抽象的:名称不是抽象的。

事实上,由于它是一个抽象类,您可以有一些已声明但未定义的值,它们本身将被标记为抽象。因此,如果您不希望“输入”是抽象的,只需定义它们:

var inputs = ArrayList[Input[_]]()

编辑:关于您在评论中的附加问题,您仍然可以使用默认值(将为空):

abstract class Input[Type]{ 
  var value:Type = _; 
}

看看将“_”分配给scala中的字段是什么意思?以及更多信息的绝佳答案。

于 2012-04-06T13:45:21.590 回答