如何在Java中编写泛型?

时间:2012-03-23 02:20:33

标签: java hibernate

我有这段代码:

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,使用一般对象类型,然后以某种方式将该类型作为第二个参数传递。 / p>

请问有人请解释如何做到这一点?

2 个答案:

答案 0 :(得分: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 });
   }
}

如果所有T都扩展了给定的类或接口,你甚至可以说

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

答案 1 :(得分:0)

cv.iterator()会返回Iterator<ConstraintViolation<Object>>,您需要Iterator<ConstraintViolation<HazardSubmission>>。这样做是因为cv定义为Set<ConstraintViolation<Object>>。如果你想要一个通用的方法,你可以改变

Set<ConstraintViolation<Object>> cv

Set<ConstraintViolation<? extends Object>> cv

以这种方式编译代码。