用通用签名覆盖抽象方法并调用它

Fra*_*ich 4 java generics

通用接口:

public interface Matcher<T> {
    public double getScore(T value1, T value2);
}
Run Code Online (Sandbox Code Playgroud)

两个实施类:

public StringMatcher implements Matcher<String> {
    public double getScore(String value1, String value2) {...}
}

public DateMatcher implements Matcher<Date> {
    public double getScore(Date value1, Date value2) {...}
}
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都很好.更换TString或者Date是没有问题的.调用getScore()如下方法也有效:

Matcher<String> matcher = new StringMatcher();
matcher.getScore("hello", "world");
Run Code Online (Sandbox Code Playgroud)

当我有一个List未知的Matcher并且我想使用该getScore()方法时,问题就开始了.

public void test() {
    List<Matcher<?>> list = new ArrayList<Matcher<?>>();
    list.add(new StringMatcher());
    list.add(new DateMatcher());

    for (Matcher<?> matcher : list) {
        Object value1;
        Object value2;
        //Setting values value1 & value2 appropriate to the current matcher
        matcher.getScore(value1, value2);
    }
}
Run Code Online (Sandbox Code Playgroud)

我无法调用,matcher.getScore(value1, value2)因为它无法处理对象参数.在这一点上,我不知道如何解决这个问题.我想保持实现类的接口和签名及其具体类型.如果无法进行类型转换或抛出异常,那就没关系.

Mar*_*nik 8

你想要类型安全和不想要它之间存在冲突,所以你只需要在它们之间做出决定.getScore使用Object参数调用显然是类型不安全的.

现在,如果您只是想要一个类型不安全的技巧来解决编译器/运行时错误,您可以将列表声明为List<Matcher>,这意味着您将从中检索原始Matchers,然后您将被允许传入Object.但是,您获得未经检查的强制转换编译器警告.