是否存在类是对象的静态语言?

时间:2011-07-05 07:23:18

标签: oop programming-languages type-systems

有很多动态类型的面向对象语言,其中类本身就是一个对象。以Smalltalk和Python为例。是否存在类是对象的静态类型语言?

编辑:
术语“对象”,我指的是一流的实体。例如,Python中的类可以传递给其他方法,可以从方法等返回。

5 个答案:

答案 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帖子。