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