为了账号安全,请及时绑定邮箱和手机立即绑定

原始类型在Java中是如何工作的?

原始类型在Java中是如何工作的?

米脂 2022-09-07 20:54:51
我正在学习泛型,我有一个误解。例如,我有这个简单的代码:import java.util.ArrayList;public class DemoApp {    public static void main(String[] args) {        ArrayList list = new ArrayList();        list.add(1);        System.out.println(list.get(0).getClass().getName());         int value = (Integer) list.get(0);    }}我不明白为什么我应该投向,因为这个陈述有这个结果?list.get(0)IntegerSystem.out.println(list.get(0).getClass().getName());java.lang.Integer如果我使用此语句,则会出现此错误:...而我真的不明白,是一个还是一个?int value = list.get(0);Type mismatch: cannot convert from Object to intlist.get(0)ObjectInteger
查看完整描述

4 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

ArrayList原始类型。它的行为类似于 .您可以向其添加对象的所有子类型(这几乎是全部)。ArrayList<Object>


因此,如果您从列表中取回一个对象,那么它是一个 - 在编译时,您无法知道它是一个还是.ObjectIntegerString


使用 .ArrayList<Integer>


编辑:


import java.util.ArrayList;


public class DemoApp {


    public static void main(String[] args) {

        ArrayList list = new ArrayList();

        list.add(1); // an int

        list.add("Test"); // an String

        list.add(new Object()); // and empty


        var rnd = RandomUtils.random(list.size());


        for (Object value : list)      

           System.out.println(value.getClass().getName()); 



       list.get(rnd) // so, what is the type of the object?

       // the compiler cannot know it (compile-time), you need to run the program and check it (runtime)


    }

}

编辑2:另见 https://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html


查看完整回答
反对 回复 2022-09-07
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

Plain ArrayList 表示 ,表示包含未指定类型的对象的 ArrayList。由于所有对象都派生自 Object,因此关于这些对象的最好选择是它们是 Objects。ArrayList<?>


在运行时,特定对象也可能变成整数(以及),这一事实并不能消除在编译时对象类型未知的问题。


考虑:


list.add(1);

list.add("two");

for (int i=0; i<list.size(); i++)

    System.out.println(list.get(i).getClass().getName()); 

现在 list.get(i) 的类型是什么?


我的问题是:你为什么要使用原始类型?


查看完整回答
反对 回复 2022-09-07
?
慕斯王

TA贡献1864条经验 获得超2个赞

因为当您使用原始类型(就像没有任何泛型类型一样)时,Java假定该列表中的元素类型是 。因此将返回类型的引用。正因为如此,你需要投掷。ArrayListObjectlist.get(0)Object

返回的对象是类型,但对它的引用是类型,这就是为什么编译器抱怨,因为您希望将类型的引用分配给基元类型的变量。list.get(0)IntegerObjectObjectint


查看完整回答
反对 回复 2022-09-07
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

将访问 List 中的元素,并在运行时发现它确实是一个整数。不过,它可能是其他任何东西。list.get(0).getClass().getName()

编译器在编译时知道的是,您的包含类型的项,请参阅 的签名。所以它不能证明这永远是正确的。您必须显式投射。listObjectList.get(int)int value = list.get(0)

Java中的整个泛型只是编译时。这是一种告诉编译器如何将类型参数化类限制为仅特定类型的方法,从而在编译时保证对它们的操作确实是正确的。也就是说,编译器不允许您将 a 放入 .StringList<Integer>

在运行时,将擦除类型参数化信息。JVM 依靠编译器完成生成正确代码的工作来运行。在运行时没有任何东西可以让JVM知道a的内容是什么类型; 具有任何类参数的单个实现。(这与 C# 或 C++ 不同。ListArrayList


查看完整回答
反对 回复 2022-09-07
  • 4 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信