简单的问题:我在 Scala 中继承了一个 FilterInputStream,它有一个 read 方法:
public void read(byte [] b,int offset,int len)
正在读取的数据将放在 b 中,但由于参数是 Scala 方法中的“vals”,我看不到正确子类化它的方法。如何将 b 设置为正在读取的数据?Java *InputStream 真的让我没有太多选择......
简单的问题:我在 Scala 中继承了一个 FilterInputStream,它有一个 read 方法:
public void read(byte [] b,int offset,int len)
正在读取的数据将放在 b 中,但由于参数是 Scala 方法中的“vals”,我看不到正确子类化它的方法。如何将 b 设置为正在读取的数据?Java *InputStream 真的让我没有太多选择......
您可以通过简单地将项目放入b
at index中。那是对这个没有影响。这只是意味着您不能重新分配(无论如何这都没有用)。i
b(i) = whatever
b
val
b
只是在 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
您正在b
为a
同一事物命名(不是副本,完全相同的 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 ...)是。它并没有显示太多,因为这些类/类型无论如何都是不可变的。
def read(b: Array[Byte], offset: Int, len: Int): Unit
等同于 Java 中的以下内容:
public void read(final byte[] b, final int offset, final int len)
该数组b
仍然是可变的,您可以修改其内容。