gpt4 book ai didi

java - 让编译器通过重载方法来完成工作是行不通的

转载 作者:行者123 更新时间:2023-12-02 05:57:20 25 4
gpt4 key购买 nike

假设我有以下类结构

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com