2012-03-23 4 views
2

私はこのコードを持っている:GenericsをJavaでキャストするにはどうすればよいですか?

FVDTO.setStatus("fail"); 
List<String[]> invalidFields = new ArrayList<String[]>(); 
Iterator<ConstraintViolation<HazardSubmission>> iterator = cv.iterator(); 
while(iterator.hasNext()) { 
    ConstraintViolation<HazardSubmission> i = iterator.next(); 
    String property = i.getPropertyPath().toString(); 
    String message = i.getMessage(); 
    invalidFields.add(new String[] { property, message }); 
} 
FVDTO.setInvalidFields(invalidFields); 
return new JsonResolution(FVDTO); 

を私はDRYものを維持するためにいくつかを取り出してきたので、私はその後、他のクラスでそれを使用することができ、すなわちHazardSubmissionは一つのクラスであり、その他があるでしょう。以下のコードは、それのようにする必要が動作しません、ここで明らかに手動で<HazardSubmission>をキャストする私の試みを、示しo.getClass();

public static List<String[]> GetInvalidProperties(Set<ConstraintViolation<Object>> cv, Object o) { 

    List<String[]> invalidFields = new ArrayList<String[]>(); 
    Iterator<ConstraintViolation<HazardSubmission>> iterator = cv.iterator(); 
    while(iterator.hasNext()) { 
    ConstraintViolation<HazardSubmission> i = iterator.next(); 
    String property = i.getPropertyPath().toString(); 
    String message = i.getMessage(); 
    invalidFields.add(new String[] { property, message }); 
} 

}私は本当に私は何を知っていないため、2番目のコードブロックに障害が発生した

そうするためには、一般的なオブジェクト型のparam 1のcvを渡したいと思って、何とか2番目のパラメータとして型に渡します。

どうすればいいですか?

+1

言うことができる指定されたクラスやインタフェースを拡張する場合は、汎用的な方法

public static <T> List<String[]> GetInvalidProperties(Set<ConstraintViolation<T>> cv){ Iterator<ConstraintViolation<T>> iterator = cv.iterator(); while(iterator.hasNext()) { ConstraintViolation<T> i = iterator.next(); String property = i.getPropertyPath().toString(); String message = i.getMessage(); invalidFields.add(new String[] { property, message }); } } 

を探しているかもしれないと思うが、全体があなたがキャストする必要がないのでジェネリックを使用する点 – edthethird

+0

あなたのメソッドが 'HazardSubmission'でのみ動作しているときに' Object'をパラメータに入れたいのですが? –

答えて

1

は、私はすべてのTは、あなたも、私は休止状態を使用していない

public static <T extends MyClassOrInterface> List<String[]> GetInvalidProperties(Set<ConstraintViolation<T>> cv){ 
    //... 
} 
+0

とてもエレガントです:) – Baconbeastnz

0

cv.iterator()Iterator<ConstraintViolation<Object>>を返信し、Iterator<ConstraintViolation<HazardSubmission>>が必要です。これは、cvがSet<ConstraintViolation<Object>>と定義されているために行われます。あなたはこのための一般的な方法が必要な場合は、あなたのコードがコンパイルされ、そのように

Set<ConstraintViolation<? extends Object>> cv 

Set<ConstraintViolation<Object>> cv 

を変更することができます。