Java ArrayList get()方法返回Integer而不是Object

4

我是Java的新手。试图理解将我的ArrayList声明为<Integer>的意义。在我的方法中,我仍然必须将.get()结果转换为int才能使其正常工作,否则它仍然返回一个Object。例如:在Sort方法的for循环中使用(int) deliv.get(j)。是否有一种避免这种情况的方法,或者我的代码是正确的方法?

问题:假设数组的大小可以改变,因此不能只使用原始数组。所有数字都应该成对出现,寻找唯一缺失其配对值的数字。我对数组进行排序,然后循环遍历这些数对以查找不匹配项。谢谢。

import java.util.*;
class StolenDrone{
public static void main(String[] args){
    ArrayList<Integer> deliv_id = new ArrayList<>();
    deliv_id.add(99);
    deliv_id.add(13);
    deliv_id.add(4);
    deliv_id.add(5);
    deliv_id.add(8);
    deliv_id.add(99);
    deliv_id.add(8);
    deliv_id.add(5);
    deliv_id.add(4);

    System.out.println("Array is: " + deliv_id);
    sort(deliv_id);
    System.out.println("Array is: " + deliv_id);
    int unique = findUnique(deliv_id);
    System.out.println("Unique ID is: " + unique);   
}

//Sort ArrayList into increasing order
static void sort(ArrayList deliv){
    int temp;
    for(int i = 0; i<deliv.size();i++){
        for (int j=0; j<deliv.size()-1;j++){
            if((int) deliv.get(j)> (int) deliv.get(j+1)){
                temp = (int) deliv.get(j+1);
                deliv.set(j+1, deliv.get(j));
                deliv.set(j, temp);
            }
        }
    }
}

//check pairs in ArrayList to find unique entry
static int findUnique(ArrayList deliv){
    for(int i = 0; i<deliv.size()-1;i+=2){
        if(deliv.get(i) == null){
            return -1; //no unique
        }
        if((int) deliv.get(i) != (int) deliv.get(i+1)){
            return (int) deliv.get(i);
        }
    }
    return -1;
}

}

1
你正在混淆引用(也称为对象)类型,例如Integer和基本类型,例如int。使用ArrayList<Integer>会使得get()返回Integer; 由于Integer和int不同,因此需要进行“强制转换”。 - GhostCat
2
应该使用ArrayList<Integer> deliv_id = new ArrayList<Integer>();,这样就不需要进行强制类型转换。使用Collections.sort(deliv_id)对数组进行排序。 - Godwin
3个回答

4
当你使用参数化的 ArrayList<Integer> 时,编译器知道 ArrayList 中的所有内容都是类型为 Integer 的,因此只允许你向列表中添加 Integer 类型的元素,因此 get() 返回的是 Integer。如果没有进行参数化,则编译器将允许你向 ArrayList 添加任何 Object,因此调用 get() 将返回一个 Object,需要强制转换为 int
为了消除强制转换的需求,你需要在函数声明中将类型为 ArrayList 的参数更改为 ArrayList<Integer>

2

在Java中,Integer是int的包装类。你不能将int作为ArrayList的类型来使用,但是你可以放置int类型的数据,它会自动转换为Integer类型。为了使其正常工作,你应该像这样做:

static void sort(ArrayList deliv){
    int temp;
    for(int i = 0; i<deliv.size();i++){
        for (int j=0; j<deliv.size()-1;j++){
            if(deliv.get(j)> deliv.get(j+1)){ // You should not cast, Integer is Comparable
                temp = deliv.get(j+1).intValue();//Changes here
                deliv.set(j+1, deliv.get(j).intValue());//And here
                deliv.set(j, temp);
            }
        }
    }
}

祝你好运


这是我在开始进行(int)转换之前的原始代码,但会返回比较两个对象的错误。正如其他人指出的那样,将带入方法的ArrayList参数包括<Integer>标签使得此代码有效。谢谢。 - Rysz

2

static void sort(ArrayList deliv)

你的方法签名要求传入一个未指定类型的ArrayList。 编译器无法知道ArrayList里面存储的内容是什么,因此需要你强制转换结果。

修改成这样:

static void sort(ArrayList<Integer> deliv)

现在编译器知道它是一个Integer类型的ArrayList。 因此你不需要再在get()方法中添加类型转换了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接