许多oo语言都有类方法和类变量的功能。例如,Ruby允许使用元类。在Scala中以类似的方式查看伴随对象是否公平?
答案 0 :(得分:2)
以类似的方式查看伴侣物体是否公平 Scala呢?
是的,这是考虑它们的合理方式。
答案 1 :(得分:2)
在JVM上,类不是与Ruby或其他动态语言相同的对象。当然,您可以将类的表示形式作为类Class[_]
的特殊对象,但它主要用于反射,并且不能使用自定义方法。但是,JVM具有静态方法和字段的概念,它们与类相关联,并且不需要使用该类的对象:
public class SomeClass
public static int add(int x, int y) { return x + y; }
}
public class OtherClass {
public static void main() {
int z = SomeClass.add(1, 2);
}
}
这些方法和字段本质上是“全局的”(除非我们考虑类加载器机制),例如,方法不能在子类中重写。
Scala不允许您直接定义和使用静态 - 语言中没有“静态”概念。但是,在Scala中,您可以定义单个对象,这些对象可用于模拟静态字段和方法,同时比静态更强大,例如,它们可以参与继承。在内部,这些对象是Scala编译器为您生成的特殊类的实例。
此外,Scala还有一些特殊的单例对象,称为伴随对象,它们与某些类共享名称:
class SomeClass
object SomeClass
在内部,这些对象是与SomeClass
完全不同的类的实例(可以作为SomeClass.type
访问),但Scala以特殊方式处理它们,例如,您可以访问SomeClass
来自SomeClass
个伴侣对象的私人成员,反之亦然。伴随对象还提供额外的隐式范围。但是,SomeClass.type
和SomeClass
是完全不同的类。
简而言之,是的,您可以将伴侣对象视为“类”方法和字段的容器,但仅在某种程度上。伴随对象不是任何方式的元类;它们具有完全不同的语义和实现。