4

通过使用 javascript 以及我的 python 经验拓宽我的视野,我提出了一些想法。

如果一个实体对外部客户的看法是通过它的接口,那么类型的目的是什么?

在静态类型语言中,类型具有非常重要的核心重要性。类型和接口是严格关联的。例如,在 java 中,当您声明一个接口 FooIface 并且一个对象实现该接口时,您不能在需要 BarIface 的上下文中使用它,即使两者在方法、签名和异常方面完全相同。

在python中不是这样。即使两个对象具有完全不同且不相关的类型,只要它们的接口相同,它们就可以完全透明地互换。如果它叫起来像鸭子一样走路,那就是鸭子。我可以通过在运行时完全改变对象的接口来完全改变对象的性质,但它会保留原始类型。

这种观点在 javascript 中发挥到了极致,任何原型链中的每个对象都只是一个对象。你在 javascript 中询问每个对象的类型,它会告诉你,它是一个对象。

在我看来,这些语言的类型概念是徒劳的。那么真正重要的是什么?类型在动态类型语言中有真正的意义吗?

4

3 回答 3

1

我看不到徒劳。考虑:

1)。当你构造一个对象

var myThing = new Thing( ... );

Thing 的类型具有重要意义。

2)。Thing 可以使用的方法

this.aProperty

根据它的类型知识

3)。您可以使用 instanceof 来确定类型

于 2010-01-08T07:49:49.050 回答
1

我倾向于将“类型”这个词理解为 Python 中的“类”这个词。这只有 99% 的正确率,但足够接近。

>>> type(object)
<type 'type'>
>>> class X(object):
...  pass
... 
>>> type(X)
<type 'type'>
>>> type(_)
<type 'type'>
>>> type(X())
<class '__main__.X'>
>>> type(X) is type(type)
True

但是,在这种情况下,我通常会避免使用“类型”这个词。一般来说,我的看法是这样的:“类型”这个词意味着所讨论的事物不是一流的对象。

于 2010-01-08T07:52:23.053 回答
1

如果一种语言只考虑一个类的实现方法来推断它符合哪些接口,你可能会意外地实现一个接口。假设在 Java 中你有接口IAIB,它们都定义了方法long getRemainingTime。在这种情况下,这些接口的合约将指定它们将返回哪种格式(一个可以以秒为单位返回时间,而另一个以毫秒为单位返回时间)。此外,使用这些接口的上下文可能非常不同。可以说它们不称为IAIB,而是称为IProgressIStopWatch. 在这种情况下,返回的时间将具有非常不同的含义。如果您能够随心所欲地互换这两个接口,您可能会得到真正意想不到的结果。

通常,该类型可以被视为执行基本的静态代码分析的辅助工具。如果你实现了一个特定的接口,编译器可以直接告诉你你可能犯了一个错误,如果你试图将你的实现实例传递给一个期望类似实现但类型不同的方法。

于 2010-01-08T10:55:04.443 回答