假设我有以下类结构
public interface Searchable{
public boolean matches(String text);
}
public abstract class AbstractSearchable implements Searchable{
private String name;
public boolean matches(String text){
return null != name && name.startswith(text);
}
}
我的大多数域对象都继承自 AbstractSearchable
,但也有一些只是 Searchable
并实现了自己的行为。
然后我有一个测试如下:
public class SearchableTest<T extends Searchable>{
public void testSearchable(){
//get an instance which is either Searchable or AbstractSearchable
T item = getSomeTestItem();
checkItem(item);
}
public void checkItem(Searchable searchable){
throw new UnsupportedOperationException("Please implement your own check for Searchable and Override checkItem(Searchable)!");
}
public void checkItem(AbstractSearchable item){
//here i can Implement the Test using the name from AbstractSearchable
//... implementation
}
}
我认为,如果 getSomeTestItem
的返回值是 AbstractSearchable,编译器会发现这一点并将其传递给“正确的”checkItem
方法。我在某处读到过(我真的忘了在哪里),Java 编译器总是找出“最适合”的类型(这意味着 TestItem 实际上比 Searchable 更“更”AbstractSearchable)。不幸的是,事实并非如此,所有 AbstractSearchables
都被传递给“错误的” checkItem` 方法。
我知道快速修复
public void checkItem(Searchable searchable){
if (searchable instanceof AbstractSearchable){
checkItem((AbstractSearchable)searchable);
} else {
throw new UnsupportedOperationException("Please implement your own check for Searchable and Override checkItem(Searchable)!");
}
}
但我真的很讨厌 instanceof
检查。我可以做些什么来使这项工作成功吗?
最佳答案
正如您所说,编译器尝试找到最合适的 - 但是 getTestItem
返回的对象类型只能在运行时知道,并且您只需将其声明为T 扩展了 Searchable
。因此,您在编译时可以找到的最佳选择是 checkItem(Searchable searchable)
:-(
关于java - 让编译器通过重载方法来完成工作是行不通的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22962383/