用于投射的Java外卡BestPractices

我已经对此进行了广泛的研究,似乎找不到这种情况的最佳实践.

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");
}
点赞