2

我看到 Java 只有一个元类(Class 类),但其他语言,比如 Smalltalk,每个类都有一个元类。

这是为什么?对元类有什么需求?以一种或另一种方式拥有它们有什么不同?

4

1 回答 1

2

对至少一个元类的基本需求是,如果您想要表示类的对象(或希望类成为对象),那么这些对象必须具有类型。

维基百科说:

在早期的 Smalltalks 中,只有一个元类称为Class. 这意味着所有类的方法都是相同的,尤其是创建新对象的方法,即new. 为了让类拥有自己的方法和自己的实例变量(称为类实例变量,不应与类变量混淆),Smalltalk-80 为每个类引入C了自己的元类C class

所以问题是,您是否希望每个类对象都具有相同的类型(因此具有相同的成员),或者您是否希望类对象以要求它们具有不同类型的方式有所不同,以便进行类型检查操作可以在代表 A 类的对象上执行,但不能在代表 B 类的对象上执行?Java 和早期的 Smalltalks 对这个问题的回答与后来的 Smalltalks 不同。

因此,例如java.lang.Class.newInstance()不接受构造函数参数,而您可以想象能够调用clz.newInstance(1)where clzis the class object for a class that has a constructor with take an可能会很好int。在 Java 中,您仍然可以自己查看类的构造函数来查找要传递的参数的匹配项,但是类对象的类型并不能告诉您是否会找到一个。

另请注意,Smalltalk 停止在一个级别。的类型CC class,但类型C classMetaclass。类型等没有无限递归C class class,因为虽然 Smalltalk 中不同的类对象接受不同的消息,但没有要求不同的元类对象接受不同的消息。

于 2012-11-05T12:38:42.323 回答