通用接口:
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");
当我有一个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);
}
}
我不能打电话matcher.getScore(value1, value2)
,因为它不能处理对象参数。在这一点上,我不知道如何解决这个问题。我想保留实现类的接口和签名及其具体类型。如果无法绕过类型转换或抛出异常,那也没关系。