1

简单的问题:我在 Scala 中继承了一个 FilterInputStream,它有一个 read 方法:

public void read(byte [] b,int offset,int len)

正在读取的数据将放在 b 中,但由于参数是 Scala 方法中的“vals”,我看不到正确子类化它的方法。如何将 b 设置为正在读取的数据?Java *InputStream 真的让我没有太多选择......

4

3 回答 3

8

您可以通过简单地将项目放入bat index中。那是对这个没有影响。这只是意味着您不能重新分配(无论如何这都没有用)。ib(i) = whateverbvalb

于 2010-10-17T17:11:31.903 回答
6

只是在 Scala 中将某物声明为 aval而不是 avar并不能使其不可变。事实上,var可以命名一个不可变的值。要记住的是,Scala 中的变量与 Java 中的变量非常相似,始终是引用或句柄,而不是实际包含值。

在你的 REPL 中试试这个:

class Container { var content: String = "default" }
val a = new Container
val b = a
b.content = "modified"
println(a.content)

当您运行时,val b = a您正在ba同一事物命名(不是副本,完全相同的 Container 实例)。因此,当您运行b.content = "modified"更改时,也会反映在其中a;它只是同一事物的另一个名称。请注意,即使a是 val,也会发生这种情况。所有的val意思是你不能改变实例a的名字。

现在想想这个细微的变化:

class Container { var content: String = "default" }
def update(c: Container) { c.content = "modified" }
val a = new Container
update(a)
println(a.content)

调用时update,其参数c也是引用或别名a。因此,更改会反映在方法调用之外,就像在前面的示例中一样。

数组是可变的,所以它们也是这样工作的。

*:原始变量(字节、双精度、整数等)在 Java 中不是引用;他们的盒装等价物(java.lang.Byte ...)是。它并没有显示太多,因为这些类/类型无论如何都是不可变的。

于 2010-10-17T20:29:46.837 回答
5
def read(b: Array[Byte], offset: Int, len: Int): Unit

等同于 Java 中的以下内容:

public void read(final byte[] b, final int offset, final int len)

该数组b仍然是可变的,您可以修改其内容。

于 2010-10-17T17:26:02.567 回答