【发布时间】:2013-05-28 16:05:20
【问题描述】:
我最近遇到了以下场景:
我有一个超类 A 和一个派生自它的 B 类。一个函数,比如 oracle,返回任一类型的对象。我想根据类型做不同的事情,但我不能为 A 和 B 引入新的成员函数。
一种解决方案是根据 getClass().getName() 进行分支。但是,我想知道多态性是否可以使用重载实现相同的行为:
public class Main
{
static class A{}
static class B extends A{}
public static void foo(A a) { System.out.println("A"); };
public static void foo(B b) { System.out.println("B"); };
static A oracle()
{
return (Math.random() > 0.5) ? new A() : new B();
}
public static void main(String[] args)
{
A x = oracle();
foo(x);
}
}
这总是输出“A”,我怀疑这是由于用于解决函数调用的早期绑定。有人可以承认这一点吗?
【问题讨论】:
-
你传递给它一个
A类型的变量,所以它调用签名为A的方法。我认为唯一的方法是使用你提到的getClass().getName()。 -
@iamnotmaynard 我会把它写下来作为解决方案(也许更冗长一些)。
-
没错。如果您绝对必须,您可以使用
instanceof运算符来打开实际的对象类型。但是将foo()放在类 A 和 B 中更好的 OO 设计(这样对象就知道要“说”什么) -
但是对象知道它的类型,如果我调用 B 覆盖的成员函数,它会起作用。
-
您可以尝试强制转换为 B,如果抛出异常,它就是 A ... 臭 :( 如果无法将成员函数添加到A 和 B。
标签: java polymorphism overloading