Java通配符引用
假设我有一个名为Value的通配符类来保存一种类型的值,它可以是字符串、int或布尔值
public class Value<Type>{
Type _value;
public Value(Type value) {
_value = value;
}
public Type getValue() {
return _value;
}
}
我将把这个类中的一组实例保存在如下数组中:
private ArrayList<Value<?>> _myValues = new ArrayList<Value<?>>();
在这之后,我将用我存储的值制作一些东西。那么,如何检查ArrayList中的每个值实例是int、String还是boolean,然后将其分配给变量呢?比如:
//If it is it
int myNumber = someValueInstance.getValue();
这样的事情有可能做到吗
谢谢
# 1 楼答案
Value<?>
本质上等同于Value<Object>
,因此getValue
的返回类型应该是Object
。可以使用instanceof
检查该值是否为Integer
、String
或Boolean
# 2 楼答案
现实地说,实现这一点的唯一方法是使用一系列
instanceof
检查,但在我看来,这违背了泛型的目的你有一个满是
Value<?>
的列表,这意味着默认的,我不知道这些Value
对象中包含什么类型,但我想要一个它们的列表如果您不关心包装中包含的类型,那么通配符形式会更方便,因为对类型的操作比它需要的更复杂(很多很多带有instanceof
的if
语句-记住,这个泛型是未绑定的)如果你知道这些类型,那么你应该在你拥有的集合中声明它们;根据需要创建尽可能多的集合。这会产生更多的开销,因为现在您必须做一些工作来将它们插入正确的列表中,但根据包装中包含的值进行操作更简单、更直接、更常规
# 3 楼答案
如果不使用原语变量来存储ArrayList的内容,我将使用包装器对象。可以从ArrayList中获取特定的值,并将其放入包装器对象中
但是如果不知道ArrayList的值的类型,我认为在将其存储在变量中之前不可能确定它,因为在存储之前必须知道存储的内容。希望这有帮助!:)