【问题标题】:ArrayList storing other than specified datatypesArrayList 存储非指定数据类型
【发布时间】:2016-12-02 17:02:29
【问题描述】:

我有一个类型为 LongArrayList,但我正在尝试在其中插入 int 值。我 期待 int也应该存储在 ArrayList 中,因为 int 的大小比 long 小。

int i=1;
ArrayList<Long> obj=new ArrayList<Long>();
obj.add(i);//It is showing error that Storing int is not possible

以下是可能的

  • 列表项

    long l=0;
    int i=5;
    l=i;
    

请提出 ArrayList 不能存储低值类型的原因。

【问题讨论】:

  • 因为自动装箱只能将long 装箱到Long - 它不能将int 装箱到Long

标签: java arraylist


【解决方案1】:

这个:

ArrayList<Long> obj=new ArrayList<Long>();

声明该列表将存储类型 Long 的对象。它正在存储引用,您不能将 Integer 放入其中,因为 Integer 不是 Long(从对象层次结构的角度来看)

不要用数字来思考这个问题。相反,试试这个。你有一个Cats 的列表。您不能在其中存储Dog。但如果列表被声明为Animals 列表,则可以。

可以声明列表包含NumberLongsIntegers 都是Numbers),但根本问题是为什么要在其中混合整数和长整数这个系列?

【讨论】:

    【解决方案2】:

    你正在这样做:

    Long l = 0L;
    int i = 5;
    l=i;//Type mismatch: cannot convert from int to Long
    

    不是这个:

    long l = 0;
    int i = 5;
    l = i;
    

    不是ArrayList的事,详情看this

    【讨论】:

      【解决方案3】:

      您只需将其转换为 long 即可使上述代码正常工作:

      obj.add((long)i);
      

      因为您指定 ArrayList 包含“Long”,它会强制进入其中的所有对象为 Long。而且由于 ArrayList 可用于存储任何类型的数据,而不仅仅是数字,因此它没有内置机制来将整数转换为长整数。适用不同的规则。

      Java 原语,如 int 和 long,允许自动转换以符合 C 和 C++ 的工作方式,因为 Java 最初是基于这些语言的。但它不会导致最干净/最安全的代码,因此一些其他更现代的语言甚至已经消除了这种类型的模糊性。

      【讨论】:

        【解决方案4】:

        long 变量l 也不能存储较低值的类型。将i 赋值给l 将隐式执行Widening Primitive Conversion,并将值存储为long

        当您尝试将int 值插入List&lt;Long&gt; 时,您隐式地尝试进行两次转换:

        这种双重转换不会被隐式应用,因此您必须告诉编译器这样做,方法是使用强制转换强制扩大原始转换:

        obj.add((long)i);
        

        【讨论】:

          【解决方案5】:

          您已将obj 声明为Long 的列表,因此它限制您使用add

          /**
           * Appends the specified element to the end of this list.
           *
           * @param e element to be appended to this list
           * @return <tt>true</tt> (as specified by {@link Collection#add})
           */
          public boolean add(E e) {
              ensureCapacityInternal(size + 1);  // Increments modCount!!
              elementData[size++] = e;
              return true;
          }
          

          注意 - 其中E 来自类定义ArrayList&lt;E&gt; extends AbstractList&lt;E&gt;

          主要只添加您的列表应包含的类型。因此,如下更改代码应该可以工作:

          int i=1;
          ArrayList<Long> obj=new ArrayList<Long>();
          obj.add(Long.valueOf(i));
          

          在你的后半部分中,演员由= 运算符处理,因为你通过以下方式分配它:

          l=i;
          

          【讨论】:

            【解决方案6】:

            ArrayList&lt;Long&gt; 只能存储 Long 的实例。

            您可以“显然”在其中存储 longs,因为 long 自动装箱为 Long

            list.add(someLong)
            

            编译成

            list.add(Long.valueOf(someLong))
            

            Boxing conversion 仅适用于从原始到相应的包装器类型:longLongintInteger 等等。但是,它不会将 int 装箱到 Long。编译器不是 聪明/宽松的。

            Java 不会将 Integer 扩展为 Long,因为没有为这些类型定义扩展:它只为原始数字类型定义。

            您只需将参数设为long,然后它就可以为您自动装箱:

            obj.add((long) i);
            

            或者,没有自动装箱:

            obj.add(Long.valueOf(i));
            

            注意,在后一种情况下,int 是采用long 参数的方法的可接受参数,因为它扩大了转换。不支持加宽 + 自动装箱。

            【讨论】:

              猜你喜欢
              • 2013-03-19
              • 2012-01-10
              • 2010-10-26
              • 1970-01-01
              • 1970-01-01
              • 2012-03-13
              • 1970-01-01
              • 1970-01-01
              • 2013-07-06
              相关资源
              最近更新 更多