我对此进行了广泛的研究,但似乎找不到适合这种情况的最佳实践。
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
最佳答案
不,没有比通过解释抑制警告更好的方法了:
@SuppressWarnings("unchecked") // this is okay because [insert reasoning]
GenericObject<Integer> gi = (GenericObject<Integer>) list.get( 0 );
请注意,但这不一定是一个好的设计 - 如果可能,最好避免未经检查的强制转换,如果只是因为它们很难证明是正确的。例如,如果 gi
会怎样?之前被输入为 GenericObject<Object>
或 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");
}
关于Java 通配符转换最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21240380/