我有一个抽象的模板方法:
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打印“我正在处理字符串”?
谢谢,
答案 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,这是缓慢/复杂且容易出错。