Language agnostic 为什么有些语言有元类?

Language agnostic 为什么有些语言有元类?,language-agnostic,metaclass,Language Agnostic,Metaclass,我看到Java只有一个元类(Class),但是其他语言,比如Smalltalk,每个类都有一个元类 为什么呢?元类的需求是什么?以这样或那样的方式拥有它们有什么区别?至少需要一个元类的基本需求是,如果希望对象表示类(或希望类是对象),那么这些对象必须具有类型 维基百科说: 在早期的Smalltalks中,只有一个元类叫做Class。这 这意味着所有类的方法都是相同的,尤其是 创建新对象的方法,即new。允许类具有 它们自己的方法和实例变量(称为类 实例变量,不应与类变量混淆), Smalltal

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


为什么呢?元类的需求是什么?以这样或那样的方式拥有它们有什么区别?

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

维基百科说:

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

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

因此,例如
java.lang.Class.newInstance()
不接受构造函数参数,而您可以想象,能够调用
clz可能会更好。newInstance(1)
其中
clz
是一个类的类对象,该类的构造函数取
int
。在Java中,您仍然可以自己查看类的构造函数,以找到要传递的参数的匹配项,但是类对象的类型不能告诉您是否会找到匹配项

还请注意,Smalltalk只在一个级别停止。
C
的类型是
C类
,但是
C类
的类型是
元类
。不存在类型的无限递归
C class
等,因为尽管Smalltalk中不同的类对象接受不同的消息,但不需要不同的元类对象接受不同的消息