有很多动态类型的面向对象语言,其中类本身就是一个对象。以Smalltalk和Python为例。是否存在类是对象的静态类型语言?
编辑:
术语“对象”,我指的是一流的实体。例如,Python中的类可以传递给其他方法,可以从方法等返回。
答案 0 :(得分:2)
在很多静态类型语言中,例如 JAVA ,一个类是一个具有自己方法的对象。 例如,在Java中,表示“String”类的对象可以作为“String.class”访问,然后您可以在此类上调用方法“ String.class.getFields()”, “getMethods()”,getConstructor()“,”cast(obj)“等。您可以在API documentation中看到”Class“类的所有方法。
尽管如此,由于语言是静态类型的,因此无法动态修改类。
换句话说,您不将在Class类中找到名为“class。 addField()”的方法。你可以做的就是通过继承“扩展”类(如果它不是最终的)。
换句话说,“类”对象是只读。
术语“对象”是指第一类实体。例如,Python中的类可以传递给其他方法,可以从方法等返回。
与任何其他对象一样,您可以将它们传递给方法并从方法返回它们(它们只是常规对象,但只暴露“读取”方法)。示例(我省略了清晰度的泛型):
public Class myMethod(Class someClassObject) {
System.out.println(someClassObject.getCanonicalName());
Class anotherClass = String.class;
return anotherClass ;
}
答案 1 :(得分:2)
我不完全同意@edutesoy的回答。
First-class表示隐式构造被定义为可以像任何对象一样传递的显式构造。 Java中的类不是“第一类”,它们是镜像,您可以在其中检查某些属性,但不是对象本身。
您无法在运行时更改类的结构,例如添加字段,更改方法体或签名,在此视角下,它部分“只读”即可。
但是让我们考虑一下静态字段。我想每个人都同意,除非final
静态字段是可变的,就像实例字段一样。在Smalltalk中,这些只是在类本身上定义的字段,而不是在类的实例上。此外,在Smalltalk中,类方法与其他方法一样具有多态性,并且:
aClass field: aValue.
根据传递的类,可能会有不同的解决方法。这在Java中是不可能的;必须通过类型引用静态字段或方法。这也意味着它不会allow overriding static methods(阅读链接以获取更多详细信息),如果它们真的是第一类的话。
在Java中可以进行反射这一事实并不能使类成为“第一类” - 您只能传递类的表示形式。回到最初的问题:我不知道任何一流类的静态类型语言(但我的知识有限,可能存在一个)。
修改强>
实际上,现在我记得它存在StrongTalk(http://www.strongtalk.org/),这是Smalltalk的静态输入。本文讨论了打字问题:Strongtalk: Typechecking Smalltalk in a Production Environment
答案 2 :(得分:1)
来自Oleg Kiselyov和Ralph Lammel的"Haskell's overlooked object system"(强调我的),
OOHaskell不仅提供传统的OO习语;我们也有 语言设计的几个功能,无论是前沿还是无法实现 在主流OO语言中:例如,第一类类和类闭包;静态类型检查的集合类,具有隐式集合参数的有界多态性;用户控制共享的多重继承;安全的共同变体 论证子类型。
答案 3 :(得分:0)
嗯,早期语言减少了它的好处。但是,类的Java反射对象基本上就是你要求的。
顺便说一句,为什么你想要这个?这不仅仅是空闲的好奇心吗?
答案 4 :(得分:0)
看看homoiconicity的概念,它指的是一种语言可以引用其自身结构的现存。另请查看Eric Lippert撰写的this帖子。