在ovverriden方法中使用多态泛型

时间:2014-08-25 17:00:27

标签: java generics polymorphism override

Hy guys,

我对使用泛型和多态方法有疑问。基本上这是我的情况:

我有一个依赖于参数的工厂,分别实例化两个类:

CSVParsingBuilder.java XMLParsingBuilder.java ,我将只显示CSV情况,因为对于XML来说,情况相同。

CSVParsingBuilder.java

class CSVParsingBuilder<T> implements IParsableBuilder<T>{

    CSVCriteriaBuilder<T> criteriaBuilder;

    @Override
    public void setCriteria(CSVCriteriaBuilder<T> criteriaBuilder) {
        this.criteriaBuilder=criteriaBuilder;
    }

    @Override
    public IParsableImp<T> buildStrategy() {
        if (criteriaBuilder == null) {
            throw new IllegalStateException("you have to specify a criteria builder");
        }
        return new CSVParsingImpl<T>(this);
    }


    public ICriteriaBuilder<T> getCriteriaBuilder() {
        return criteriaBuilder;
    }
}

CSVCriteriaBuilder.java

public class CSVCriteriaBuilder<T> implements ICriteriaBuilder<T>{....}

IParsableBuilder.java

public interface IParsableBuilder<T> {

    public IParsableImp<T> buildStrategy();
    public void setCriteria(ICriteriaBuilder<T> criteriaBuilder);
}

现在编译器抱怨我,因为setCriteria调用正在使用ICriteriaBuilder类似参数的子类,所以我无法正确使用@Override注释。

我想知道是否有可能在setCriteria接口中更改IParsableBuilder方法的签名,只是为了接受任何扩展ICriteriaBuilder的参数,如下所示:

IParsableBuilder.java

public interface IParsableBuilder<T> {

    public IParsableImp<T> buildStrategy();
    public void setCriteria(? extends ICriteriaBuilder<T> criteriaBuilder);
}

有人可以帮忙吗?提前致谢。

1 个答案:

答案 0 :(得分:1)

您可能需要再引入一个类型参数:

public interface IParsableBuilder<T, S extends ICriteriaBuilder<T>> {

    public IParsableImp<T> buildStrategy();
    public void setCriteria(S criteriaBuilder);
}

然后将其实现为:

class CSVParsingBuilder<T> implements IParsableBuilder<T, CSVCriteriaBuilder<T>>{

    CSVCriteriaBuilder<T> criteriaBuilder;

    @Override
    public void setCriteria(CSVCriteriaBuilder<T> criteriaBuilder) {
        this.criteriaBuilder=criteriaBuilder;
    }
    ....
}

它会以这种方式工作。我不认为这是可能的。原因是,允许使用协变返回类型的方法覆盖,但是不允许使用协变形式参数类型。