有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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();

这样的事情有可能做到吗

谢谢


共 (3) 个答案

  1. # 1 楼答案

    Value<?>本质上等同于Value<Object>,因此getValue的返回类型应该是Object。可以使用instanceof检查该值是否为IntegerStringBoolean

    Object val = someValueInstance.getValue();
    if (val instaceof Integer) {
        int number = (Integer)val;
        //...
    } else if (val instaceof String) {
        String string = (String)val;
        //...
    } else if (val instaceof Boolean) {
        boolean bool = (Boolean)val;
        //...
    }
    
  2. # 2 楼答案

    现实地说,实现这一点的唯一方法是使用一系列instanceof检查,但在我看来,这违背了泛型的目的

    你有一个满是Value<?>的列表,这意味着默认的,我不知道这些Value对象中包含什么类型,但我想要一个它们的列表如果您不关心包装中包含的类型,那么通配符形式会更方便,因为对类型的操作比它需要的更复杂(很多很多带有instanceofif语句-记住,这个泛型是未绑定的

    如果你知道这些类型,那么你应该在你拥有的集合中声明它们;根据需要创建尽可能多的集合。这会产生更多的开销,因为现在您必须做一些工作来将它们插入正确的列表中,但根据包装中包含的值进行操作更简单、更直接、更常规

    List<Type<String>> stringWrappers = new ArrayList<>();
    List<Type<Integer>> integerWrappers = new ArrayList<>();
    List<Type<Boolean>> booleanWrappers = new ArrayList<>();
    
  3. # 3 楼答案

    如果不使用原语变量来存储ArrayList的内容,我将使用包装器对象。可以从ArrayList中获取特定的值,并将其放入包装器对象中

    但是如果不知道ArrayList的值的类型,我认为在将其存储在变量中之前不可能确定它,因为在存储之前必须知道存储的内容。希望这有帮助!:)