java - 覆盖具有通用签名的抽象方法并调用它

标签 java generics

通用接口(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 替换为 StringDate 不是问题。 如下调用 getScore() 方法也有效:

Matcher<String> matcher = new StringMatcher();
matcher.getScore("hello", "world");

当我有一个未知 MatcherList 并且我想使用 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)和实现类的签名及其具体类型。如果没有办法绕过类型转换或抛出异常也没关系。

最佳答案

你在想要类型安全和不想要类型安全之间存在冲突,所以你只需要在它们之间做出决定。打电话getScoreObject arguments 显然是类型不安全的。

现在,如果您只是想要一个类型不安全的技巧来绕过编译器/运行时错误,您可以将列表声明为 List<Matcher> ,这意味着您将检索原始 Matcher s 从它,然后你将被允许通过 Object不过,你得到一个unchecked cast编译器警告。

关于java - 覆盖具有通用签名的抽象方法并调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14025672/

相关文章:

java - 如何禁用除特定输入之外的键盘输入,或在使用错误的输入时显示错误?

java - Ant,运行所有 jUnit 测试

java - 如何引用泛型参数自身的参数,比如T2<T>中的T?

java - 在保留泛型的同时创建不同的 JTable

c# - 泛型的循环依赖

c# - 与泛型打结

java - 仅在 getter 上使用 XmlTransient 注释?

java - SpringBoot 1.2.1 MongoRepository

java - Cosmos Db 回复消息长度错误使用 mongo java 驱动程序执行查找

java - Easymock 通用匹配器在 Eclipse 中编译错误,但可以通过 ant 构建