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

标签 java compiler-construction overloading strong-typing

假设我有以下类结构

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/

相关文章:

c++ - 用友元类重载构造函数

java - 使用枚举类型重载

java - 类型不匹配 : cannot convert from org. json.JSONObject 到 org.json.simple.JSONObject

java - 从模板开始用JAVA生成ODT文档

java - GlassFish 身份验证基本用户名和密码

java - 使用 Apache Wink 通过 Java REST 服务返回 excel 文档

c# - 什么是/优化 C# 编译器 key ?

c++ - 将模板函数和重载作为函数参数传递

compiler-construction - 将crypto++库与我的应用程序链接的正确方法

compiler-construction - 达到定义数据流问题的特例