2014-04-08 2 views
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"); 
    } 
} 

내 질문은 :이 클라이언트 클래스에서이 캐스트를 방지 할 수있다? 어떻게? 더 나은 아키텍처를 가질 수있는 방법이 있습니까?

덕분에

답변

2

를 읽는 당신이 Comparable로 당신의 유형을 필요로 할 수 있으리라 믿고있어.

매개 변수화 EqualOpGreaterThanOp 같은 :

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>(); 
    } 
    ... 
+1

최상의 결과를 사용하기 위해'>' – newacct

관련 문제