【发布时间】:2014-08-22 18:50:52
【问题描述】:
我最近在学习Objective C,了解到在Objective C中,你可以在一个对象上运行一个方法,即使它的Type没有声明它。我想知道为什么你不能在 Java 中做到这一点。
例如:
class Animal{
public void move(){/*something*/}
}
class Dog extends Animal{
public void bark(){/*barks*/}
}
//In another class:
Animal anInstanceOfADog = new Dog();
anInstanceOfADog.bark()// <- This would be an error, as Animal doesn't have the method bark.
在这种情况下,我们会收到一个错误,因为 Animal 不能吠叫。尽管如此,该对象是一个 Dog 的引用,而 Dog 可以吠叫。
因此,问题是:类型在 Java 代码的执行中扮演什么角色?为什么会这样?
谢谢,
院长
【问题讨论】:
-
这是一个简单的多态问题。任何关于 Java 的书都可以解释它。或者只是在 Google 上搜索。
-
Java 是“类型安全的”。这是开始阅读的好地方。 en.wikipedia.org/wiki/Type_safety
-
我的 Objective C 非常基础,但据我了解,您可以“询问”在对象的给定实例上执行方法,但这并不能保证执行会发生。这很像尝试在 Java 中针对未知对象进行反射调用
-
通过自动装箱,您可以将所有内容视为对象,通过反射您可以进行鸭式打字。简而言之,您可以在 Java 中做同样的事情;但代码并不漂亮。
-
@DeanLeitersdorf 您上一条评论的答案基本上是“静态类型的用途是什么”的答案,并且是这些天相当规模辩论的主题......