java重载方法

时间:2011-01-09 18:03:02

标签: java

我有一个抽象的模板方法:

class abstract MyTemplate
{
    public void something(Object obj)
    {
        doSomething(obj)

     }

    protected void doSomething(Object obj);

}

class MyImpl extends MyTemplate
{

   protected void doSomething(Object obj)
   {
      System.out.println("i am dealing with generic object");
   }

   protected void doSomething(String str)
   {
      System.out.println("I am dealing with string");
   }
}


public static void main(String[] args)
{
   MyImpl impl = new MyImpl();
   impl.something("abc"); // --> this return "i am dealing with generic object"

}

如何在doSomething(Object obj)中使用instanceof打印“我正在处理字符串”?

谢谢,

4 个答案:

答案 0 :(得分:2)

嗯,你真的不能这样做。 Java不能开箱即用。问题是方法调用的绑定通常主要在编译时完成。

此处http://en.wikipedia.org/wiki/Double_dispatch

在这里

http://www.javaperformancetuning.com/articles/ddispatch2.shtml

答案 1 :(得分:0)

不可能。 MyImpl中的doSomething(Object obj)是覆盖MyTemplate中的doSomething的方法。

在MyImpl中的doSomething(Object obj)中使用instanceof-operator。无论如何,这是更好的风格。

答案 2 :(得分:0)

总之,你不能。其他答案解释了原因。另一种方法可能是使用泛型,并依赖抽象类的特定子类型来处理字符串(或其他特定类)。例如:

abstract public class MyTemplate<T> {
    abstract public void doSomething(T t);
}

public class MyTemplateImpl extends MyTemplate<Object> {

    @Override
    public void doSomething(Object o) {
        System.out.println("Dealing with a generic Object");
    }
}

public class MyTemplateImplForStrings extends MyTemplate<String> {
    @Override
    public void doSomething(String s) {
        System.out.println("dealing with a String");
    }
}

这意味着您的调用代码如下所示:

MyTemplateImplForStrings template = new MyTemplateImplForStrings();
template.doSomething("hello");  //prints ""dealing with a String"

MyTemplate<String> template = new MyTemplateImplForStrings();
template.doSomething("hello");  //prints ""dealing with a String"

注意:除非使用String对其进行参数化,否则您将希望避免使用抽象基类作为引用类型;否则你将在运行时为ClassCastExceptions打开门,编译器应警告你。

答案 3 :(得分:0)

java编译器使用方法参数的编译时类型来创建方法调用,在您的示例中,该调用是Object而不是String。方法调用忽略参数的运行时类型。

如果您控制所有输入类或使用visitor pattern,您可以尝试reflection,这是缓慢/复杂且容易出错。