通过使用javascript和我的python经验拓宽视野,我想了一下。
如果实体对外部客户的愿景是通过其界面,那么输入的目的是什么?
在静态类型语言中,类型具有非常强大的核心重要性。类型和接口严格关联。例如,在java中声明接口FooIface并且对象实现该接口时,不能在需要BarIface的上下文中使用它,即使两者在方法,签名和异常方面完全相同。
在python中不是这样。即使两个对象具有完全不同且不相关的类型,只要它们的接口相同,它们就可以完全透明地互换。如果它嘎嘎叫,像鸭子一样走路,它就是一只鸭子。我可以通过在运行时完全改变它的接口来完全改变对象的性质,但它将保留原始类型。
这种观点在javascript中被置于极端,其中任何原型链中的每个对象都只是一个对象。你问javascript中每个对象的类型,它会告诉你,它是一个对象。
在我看来,这些语言的类型概念是徒劳的。什么是非常重要的?类型在动态类型语言中是否具有实际意义?
答案 0 :(得分:1)
我看不出徒劳。考虑:
1)。构造对象时
var myThing = new Thing( ... );
Thing的类型具有重要意义。
2)。 Thing的方法可以使用
this.aProperty
根据其类型知识
3)。您可以使用instanceof来确定类型
答案 1 :(得分:1)
我倾向于将“type”这个词理解为与Python中的“class”相同。这只有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
但是,我确实在这种情况下通常避免使用“类型”一词。一般来说,我看待它的方式是:“类型”一词意味着所讨论的东西不是一流的对象。
答案 2 :(得分:1)
如果某种语言仅考虑类的实现方法来推断它符合哪种接口,则可以意外地实现接口。让我们说在Java中你有接口 IA 和 IB ,它们都定义了方法 long getRemainingTime 。在这种情况下,这些接口的契约将指定它们将返回什么样的格式(一个可以以秒为单位返回时间,而另一个以毫秒返回时间)。使用这些接口的上下文也可能非常不同。可以说它们不是名为 IA 和 IB ,而是 IProgress 和 IStopWatch 。在这种情况下,返回的时间将具有非常不同的含义。如果你能够按照自己喜欢的方式交换这两个接口,那么你可能会得到意想不到的结果。
通常,类型可以被视为执行基本静态代码分析的辅助手段。如果您实现了一个特定的接口,那么编译器可以直接告诉您,您可能犯了一个错误,如果您尝试将实现的实例传递给期望类似实现但类型不同的方法。