ric*_*ter 6 java generics casting wildcard
我已经对此进行了广泛的研究,但似乎无法找到适合这种情况的最佳实践。
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);
}
}
Run Code Online (Sandbox Code Playgroud)
当这段代码起作用时,从 GenericObject <?> 到 GenericObject<Integer> 的转换给出了一个未经检查的警告。现在你可以看到我已经用 if 语句清楚地检查了类型,所以我对异常并不偏执,但是有没有更好的方法来做到这一点而不必抑制未经检查的警告?这种情况有最佳实践吗?我已阅读了整个仿制甲骨文的教程在这里,我有看了很多帖子计算器,但没有的,似乎回答了这个问题。任何帮助将不胜感激谢谢。
不,没有比抑制警告更好的方法了,并给出解释:
@SuppressWarnings("unchecked") // this is okay because [insert reasoning]
GenericObject<Integer> gi = (GenericObject<Integer>) list.get( 0 );
Run Code Online (Sandbox Code Playgroud)
请注意,这不一定是一个好的设计 - 如果可能的话,最好避免未经检查的强制转换,即使只是因为它们很难证明其合理性。例如,如果gi之前输入的是GenericObject<Object>or GenericObject<Number>,而恰好包含了 ,该怎么办Integer?检查并转换值本身可能会更好:
GenericObject<?> go = list.get(0);
Object obj = go.getGenericValue();
if (obj instanceof Integer) { // or obj.getClass() == Integer.class
System.out.println("Was Integer");
}
Run Code Online (Sandbox Code Playgroud)