通用接口(interface):
public interface Matcher<T> {
public double getScore(T value1, T value2);
}
两个实现类:
public StringMatcher implements Matcher<String> {
public double getScore(String value1, String value2) {...}
}
public DateMatcher implements Matcher<Date> {
public double getScore(Date value1, Date value2) {...}
}
目前一切正常。将 T
替换为 String
或 Date
不是问题。
如下调用 getScore()
方法也有效:
Matcher<String> matcher = new StringMatcher();
matcher.getScore("hello", "world");
当我有一个未知 Matcher
的 List
并且我想使用 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);
}
}
我无法调用 matcher.getScore(value1, value2)
,因为它无法处理对象参数。
在这一点上,我不知道如何解决这个问题。我想保留接口(interface)和实现类的签名及其具体类型。如果没有办法绕过类型转换或抛出异常也没关系。
最佳答案
你在想要类型安全和不想要类型安全之间存在冲突,所以你只需要在它们之间做出决定。打电话getScore
与 Object
arguments 显然是类型不安全的。
现在,如果您只是想要一个类型不安全的技巧来绕过编译器/运行时错误,您可以将列表声明为 List<Matcher>
,这意味着您将检索原始 Matcher
s 从它,然后你将被允许通过 Object
不过,你会得到一个unchecked cast编译器警告。
关于java - 覆盖具有通用签名的抽象方法并调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14025672/