我看到 Java 只有一个元类(Class 类),但其他语言,比如 Smalltalk,每个类都有一个元类。
这是为什么?对元类有什么需求?以一种或另一种方式拥有它们有什么不同?
我看到 Java 只有一个元类(Class 类),但其他语言,比如 Smalltalk,每个类都有一个元类。
这是为什么?对元类有什么需求?以一种或另一种方式拥有它们有什么不同?
对至少一个元类的基本需求是,如果您想要表示类的对象(或希望类成为对象),那么这些对象必须具有类型。
维基百科说:
在早期的 Smalltalks 中,只有一个元类称为
Class
. 这意味着所有类的方法都是相同的,尤其是创建新对象的方法,即new
. 为了让类拥有自己的方法和自己的实例变量(称为类实例变量,不应与类变量混淆),Smalltalk-80 为每个类引入C
了自己的元类C class
。
所以问题是,您是否希望每个类对象都具有相同的类型(因此具有相同的成员),或者您是否希望类对象以要求它们具有不同类型的方式有所不同,以便进行类型检查操作可以在代表 A 类的对象上执行,但不能在代表 B 类的对象上执行?Java 和早期的 Smalltalks 对这个问题的回答与后来的 Smalltalks 不同。
因此,例如java.lang.Class.newInstance()
不接受构造函数参数,而您可以想象能够调用clz.newInstance(1)
where clz
is the class object for a class that has a constructor with take an可能会很好int
。在 Java 中,您仍然可以自己查看类的构造函数来查找要传递的参数的匹配项,但是类对象的类型并不能告诉您是否会找到一个。
另请注意,Smalltalk 停止在一个级别。的类型C
是C class
,但类型C class
是Metaclass
。类型等没有无限递归C class class
,因为虽然 Smalltalk 中不同的类对象接受不同的消息,但没有要求不同的元类对象接受不同的消息。