[英]How does java determine, which overloaded method will call, when one method with generic type parameter and other with non generic parameter?
[英]How to call overloaded method when the parameter is a subclass of a given type?
我有一个抽象类A
,两个名为B
, C
子类和两个位于单独类中的重载方法:
public void process(B objB) {...}
public void process(C objC) {...}
从存储库中,我检索了一个类型为A
的实体,我想进行这样的调用:
A objA = repo.findById(id);
process(objA);
我知道需要强制转换,但我不想使用instanceof
或大量if
语句进行大量检查。
哪些是实现这种方法调用的最佳选择? 而且这样的代码设计好不好?
使用instanceof
不是一个好的选择,特别是如果你有很多地方需要访问特定的子类。
明显的方法是将没有参数的抽象process()
方法添加到基类中,并通过从另一个类调用相应的process(this)
方法并将this
引用传递给它来在子类中实现它。
当首选从类层次结构中划分处理逻辑时(大概是您的情况),有一对模式: Strategy或更一般的Visitor 。 以下是访问者模式用法的示例:
abstract class A { <T> T accept(Visitor<T> visitor); } class B extends A { @Override public <T> T accept(Visitor<T> visitor) { return visitor.visit(this); } } class C extends A { @Override public <T> T accept(Visitor<T> visitor) { return visitor.visit(this); } } interface Visitor<T> { T visit(B bObject); T visit(C cObject); }
然后通过实现相应的访问者来定义特定的操作:
Visitor<Integer> visitor = new Visitor<Integer>() { @Override public Integer visit(B bObject) { // TODO do something with bObject return null; } @Override public Integer visit(C cObject) { // TODO do something with cObject return null; } };
只需致电接受:
A objA = repo.findById(id); Integer result = objA.accept(visitor);
如果不首先强制转换对象,则无法在此实例中使用重载方法,因为如果显式对象类型不匹配,程序将不会调用重载方法。 所以它不会调用 process(B objB) 除非你传递的对象是 B 类。
为了避免太麻烦,有几种方法可以做到。 根据 B 和 C 之间的区别,您可以在从数据库中提取对象时将 A 实例化为该类型(这可以在 RowMapper 中完成)并编写 if else 语句以确定要调用哪个进程:
if(a.getClass() == B.class)
{
return process((B) a);
}
else
{
return process((C) a);
}
或者,如果您有更多子类,则可以使用 switch 语句。 这是我能想到的最简单的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.