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);
}
有人可以帮忙吗?提前致谢。
答案 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;
}
....
}
它会以这种方式工作。我不认为这是可能的。原因是,允许使用协变返回类型的方法覆盖,但是不允许使用协变形式参数类型。