2012-03-23 2 views
2

나는이 코드를 가지고 : 나는 그래서 다음 다른 클래스로 사용할 수 있습니다 건조하게 유지하기 위해 일부를 촬영했습니다Java에서 Generics를 어떻게 캐스팅 할 수 있습니까?

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); 

을, 즉 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 }); 
} 

} 정말 난 무엇을 모르기 때문에 두 번째 코드 블록이 실패

그러고 나면, 일반적인 객체 타입을 가진 param 1을 cv로 넘기고, 두 번째 매개 변수로 그 타입을 전달하려고한다.

다른 사람에게이 방법을 설명해 주시겠습니까?

+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 

을 변경할 수 있습니다.

관련 문제