Как я могу привести Дженерики в Java? - PullRequest
2 голосов
/ 23 марта 2012

У меня есть этот код:

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

}

Второй блок кода дает сбой, потому что я действительно не знаю, что я делаю, я хочу передать cv для параметра 1 с общим типом объекта, а затем каким-то образом передать тип как второй параметр.

Не могли бы вы кто-нибудь объяснить, как это сделать?

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Я думаю, вы можете искать общий метод

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

Если все T расширяют данный класс или интерфейс, вы могли бы даже сказать

public static <T extends MyClassOrInterface> List<String[]> GetInvalidProperties(Set<ConstraintViolation<T>> cv){
     //...
}
0 голосов
/ 23 марта 2012

cv.iterator() вернет вам Iterator<ConstraintViolation<Object>>, а вам нужно Iterator<ConstraintViolation<HazardSubmission>>. Это сделано потому, что cv определяется как Set<ConstraintViolation<Object>>. Если вам нужен общий способ для этого, вы можете изменить

Set<ConstraintViolation<Object>> cv

до

Set<ConstraintViolation<? extends Object>> cv

таким образом, ваш код будет компилироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...