0

有一个类(特别是com.twitter.scalding 中的TypedPipe[T])只有一个私有构造函数,我希望向它添加一些方法。它看起来像这样

class TypedPipe[+T] private ( a : Int) { 

}

这通常通过定义隐式转换方法来完成。但是,我需要访问 a 来定义我想要的方法。这在 Scala 中是不可能的吗?

4

2 回答 2

3

如果我正确解释了您的问题,答案是肯定的,这在 Scala 中根本不可能。这与私有构造函数无关。如果它是公开的,您将遇到完全相同的问题。

class TypedPipe[+T] private ( a : Int) { 

}

这里的重点是没有valor varbefore aa不是 的属性TypedType,而只是其构造函数的参数,即没有创建属性来保存对象内部 a 的值

这等效于 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在构造函数之外访问,它必须是 avar或 aval

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

于 2013-01-23T08:27:37.930 回答
2

只有TypedPipe的同伴可以调用它的构造函数。时期。大概有一个工厂(在所说的伴侣中)可以用来创建实例(否则它有什么好处?)。从那里你可以......这些天接受的术语是什么?“延长?” “提高?” 或者,正如我们老前辈所说,“皮条客”那种。

于 2013-01-23T04:31:47.343 回答