我已经对此进行了广泛的研究,似乎找不到这种情况的最佳实践.
ArrayList<GenericObject<?>> list = new ArrayList<>();
list.add( new GenericObject<Integer>(6) ); // Autoboxing
list.add( new GenericObject<String>("HI") );
if(list.get( 0 ).getGenaricValue().getClass() == Integer.class){
GenericObject<Integer> gi = (GenericObject<Integer>) list.get( 0 );
System.out.println("Was Integer");
System.out.println(gi);
}
}
虽然这段代码适用于GenericObject<?>的演员表.到GenericObject< Integer>给出一个未经检查的警告.现在您可以看到我已经使用我的if语句清楚地检查了类型,所以我对异常没有偏执,但有没有更好的方法来做到这一点而不必抑制未经检查的警告?这种情况有最佳实践吗?
我已经阅读了整个Generics oracle教程 here ,我已经阅读了很多stackoverflow帖子,但似乎都没有回答这个问题.任何帮助将不胜感激.
最佳答案 不,没有比抑制警告更好的方法,并作出解释:
@SuppressWarnings("unchecked") // this is okay because [insert reasoning]
GenericObject<Integer> gi = (GenericObject<Integer>) list.get( 0 );
请注意,这不一定是一个好的设计 – 如果可能的话,最好避免未经检查的强制转换,只是因为它们很难证明是合理的.例如,如果之前已将gi键入为GenericObject< Object>,该怎么办?或GenericObject< Number>刚刚碰巧持有一个整数?检查并转换值本身可能更好:
GenericObject<?> go = list.get(0);
Object obj = go.getGenericValue();
if (obj instanceof Integer) { // or obj.getClass() == Integer.class
System.out.println("Was Integer");
}