当我遇到以下问题时,我正在准备决赛,并尝试在教科书背面解决运动问题:
在Java中,如果p的具体类型为Foo,则p.getClass()和Foo.class将返回相同的内容。解释为什么不能保证在Ruby,Python或JavaScript中保持类似的等效性。
任何人都可以阐明这一点。提前致谢!
Ruby,Python和JavaScript都是动态类型化的语言,但这不是静态类型还是动态类型的问题。相反,我认为这与Java语言getClass()
是最终语言(不能被覆盖)而其他语言没有这样的限制有关:
# Ruby
class Foo
def class()
return String
end
end
String.new().class() == String # => true
Foo.new().class() == Foo # => false
# Python
class Foo: pass
class Bar: pass
p = Foo()
p.__class__ == Foo # => True
p.__class__ = Bar
p.__class__ == Foo # => False
// JavaScript
function Foo() { }
function Bar() { }
var p = new Foo();
p.constructor == Foo; // => true
p.constructor = Bar;
p.constructor == Foo; // => false
有趣的是,在Python的情况下,该__class__
成员实际上会影响方法的查找,因此可以认为的具体类型p
为now Bar
,这并不违反等效性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句