[英]Avoid cast in a generics hierarchy
我有一些困難來簡化更多問題。 對不起,如果他們的代碼太多了。 我嘗試改進上面代碼的架構,因為我討厭警告和演員,我覺得有些不對勁。
現在,代碼。 我有一個帶有這兩個參數化方法的util類(與OpenJPA的CriteriaBuilder相同的簽名......)
public class MyUtil {
public void equal(List<?> l, Object value) {
// do something (see CriteriaBuilder.equal method)
}
public <Y extends Comparable<? super Y>> void greaterThan(List<? extends Y> l, Y value) {
// do something (see CriteriaBuilder.greaterThan method)
}
}
然后,我希望能夠抽象它們通過接口調用它。
public interface IOperation<T> {
// maybe make this method generic ? but how ?
public abstract void doOp(List<T> l, T value);
}
public abstract class AbstractOperation<T> implements IOperation<T> {
protected MyUtil myUtil;
}
public class EqualOp extends AbstractOperation<Object> {
@Override
public void doOp(List<Object> path, Object value) {
myUtil.equal(path, value);
}
}
public class GreaterThanOp<T extends Comparable<? super T>> extends AbstractOperation<T> {
@Override
public void doOp(List<T> path, T value) {
myUtil.greaterThan(path, value);
}
}
我創建了一個工廠
public class OperationFactory {
private static OperationFactory instance;
public static OperationFactory getInstance() {...}
public IOperation<?> get(String op) {
if ("=".equals(op)) {
return new EqualOp();
} else if (">".equals(op)) {
return new GreaterThanOp<Comparable<? super Object>>();
}
throw new InvalidParameterException();
}
}
然后我用它:
public class Client {
public void needOp(String op) {
IOperation<String> operation = (IOperation<String>) OperationFactory.getInstance().get(op); // How to avoid this cast ?
List<String> l = null;
operation.doOp(l, "a string");
}
}
我的問題是:是否可以在Client類中避免這種強制轉換? 怎么樣 ? 有沒有辦法建立更好的架構?
謝謝閱讀
我假設你可以要求你的類型是可Comparable
。
像GreaterThanOp
一樣參數化EqualOp
:
public class EqualOp<T extends Comparable<T>> extends AbstractOperation<T> {
@Override public void doOp(List<T> path, T value) ...
並像這樣定義get()
:
public <T extends Comparable<T>> IOperation<T> get(String op) {
if ("=".equals(op)) {
return new EqualOp<T>();
} else if (">".equals(op)) {
return new GreaterThanOp<T>();
}
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.