通用接口:
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)
到目前为止一切都很好.更换T用String或者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)因为它无法处理对象参数.在这一点上,我不知道如何解决这个问题.我想保持实现类的接口和签名及其具体类型.如果无法进行类型转换或抛出异常,那就没关系.
你想要类型安全和不想要它之间存在冲突,所以你只需要在它们之间做出决定.getScore使用Object参数调用显然是类型不安全的.
现在,如果您只是想要一个类型不安全的技巧来解决编译器/运行时错误,您可以将列表声明为List<Matcher>,这意味着您将从中检索原始Matchers,然后您将被允许传入Object.但是,您将获得未经检查的强制转换编译器警告.
| 归档时间: |
|
| 查看次数: |
192 次 |
| 最近记录: |