有一个类(特别是com.twitter.scalding中的TypedPipe[T])只有一个私有构造函数,我希望添加一些方法。它看起来像这样
class TypedPipe[+T] private ( a : Int) {
}
这通常通过定义隐式转换方法来完成。但是,我需要访问 a 来定义我想要的方法。这在 Scala 中根本不可能吗?
如果我正确解释了你的问题,答案是肯定的,这在 Scala 中根本不可能。这与私有构造函数无关。如果它是公开的,你会遇到完全相同的问题。
class TypedPipe[+T] private ( a : Int) {
}
这里的重点是,在a
之前没有val
或var
。 a
不是TypedType
的属性,而只是其构造函数的一个参数,即没有创建任何属性来保存对象内部的值
这等效于 Java 代码:
public class MyClass{
private final String value;
public MyClass(int a){
System.out.println("I was initialized with " + a);
this.value="b";
}
}
实际上,您可以使用 REPL 轻松检查它。如果希望a
在构造函数外部可访问,它必须是var
或val
class TypedPipe[+T] private ( a : Int) {
println(a)
}
class TypedPipe1[+T] private (val a : Int) {
println(a)
}
我是 REPL 中 javap 反汇编器的忠实粉丝:
scala> :javap -p TypedPipe
scala> Compiled from "TypedType.scala"
public class TypedPipe extends java.lang.Object implements scala.ScalaObject{
private TypedPipe(int);
}
scala> :javap -p TypedPipe1
scala> Compiled from "TypedType.scala"
public class TypedPipe1 extends java.lang.Object implements scala.ScalaObject{
private final int a;
public int a();
private TypedPipe1(int);
}
如您所见,在第一个版本中,没有成员属性来保存 a
的值,也没有 getter
只有TypedPipe
的同伴可以调用它的构造函数。时期。大概有一个工厂(在所述伴侣中)可以用来创建实例(否则它有什么用?从那里你可以...这些天公认的术语是什么?"延伸?"增强?"或者,正如我们老前辈所说,"皮条客"那种类型。