0
더 많은 문제를 단순화하는 데 어려움이 있습니다. 죄송합니다. 여기에 코드가 너무 많습니다. 경고 및 캐스트가 싫어서 잘못된 것을 느낄 수 있으므로 위 코드의 아키텍처를 개선하려고합니다.제네릭 계층에서 캐스트 피하기
이제 코드입니다. 나는 폴더의 유틸리티의 두 가지 매개 변수화 방법과 클래스가 (는 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");
}
}
내 질문은 :이 클라이언트 클래스에서이 캐스트를 방지 할 수있다? 어떻게? 더 나은 아키텍처를 가질 수있는 방법이 있습니까?
덕분에
최상의 결과를 사용하기 위해'>' –
newacct