当前位置: 首页 > 知识库问答 >
问题:

为什么泛型数组中的setter方法可以工作(JAVA)?

路昆杰
2023-03-14
class Demo<T>{
    T d[]=(T[])new Object[3];
    T x;
    int l=0;
    void setD(T x){
        d[l++]=x; //Why does this work?
    }
    void getD(int x){
        System.out.println(d[x]); //Why does this work too? as i cant print in main class directly
    }

}

public class Main<T> {

    public static void main(String[] args) {

        Demo<Integer> de=new Demo<>();
        de.x=7; //This doesnt throw any error

        //de.d[0]=3; //This throws runtime error. Runtime error is given below.. I understand why this doesn't work 
//but i wanted to know why does that setter method work as this line of code seems similar to that of setter method
        de.setD(3);

        de.getD(0);

    }
}

共有1个答案

朱和惬
2023-03-14

我想那是因为字型擦除。看这条线。

Demo<Integer> de=new Demo<>();
de.d[0]=3; //java knows, that de.d should be Integer[], but it actually is Object[]

这里,由于指定了generic参数,java希望de.d是integer[]。但它实际上是object[]。java试图将对象数组视为整数数组。

为此,java必须将Object[]强制转换为Integer[]。它会引发异常。如果执行以下操作,将引发相同的异常

Integer[] ints = (Integer[])new Object[10];
T d[]=(T[])new Object[3];
void setD(T x){
    d[l++]=x; //Why does this work?
}
Object d[]= (Object[])new Object[3];
void setD(Object x){
    d[l++]=x; // x is Integer here
}
 类似资料:
  • ArrayList的get()方法为什么可以直接将Object数组返回成泛型里的T? 今天阅读ArrayList源码时,为什么可以直接在返回类型为泛型的方法里直接返回Object数组,而我自己定义的类里却需要强转? 以下是ArrayList源码 而我的代码却无法编译

  • 问题内容: 您认为可以创建类似的东西吗? 问题答案: 是的你可以。 用法示例:

  • 问题内容: 为什么以下代码会编译?该方法返回该类型或其子类的实例。类中的代码调用该方法。编译器允许将返回值存储到类型的变量(显然不在的层次结构中)。 即使在擦除类型之后, 返回类型也不应该仍然是的实例 吗? 该方法的字节码为: 编辑:一致地替换为。 问题答案: 这实际上是合法的类型推断*。 我们可以将其简化为以下示例(Ideone): 因为是接口,所以允许编译器推断(无意义的,实际上是)交集类型。

  • 为什么<代码>列表 我不明白编译器的消息和编译错误的原因。 返回类型没有问题:

  • 我想做一个学习Java EE的项目。我已经计划建立一个票务管理系统。所以我已经创建了一个mysql数据库、实体类、访问类、ejb类以及最后的WService类。对于个人座位和顾客桌,我的CRUD操作工作正常。我用Soap UI尝过。 之后,我创建了一个泛型访问类。现在我的获取选项不起作用,我正在获取 从其他3个方法中,我得到了“HTTP/1.1 200 OK”的回复。 下面是access类geta

  • 在以下Java代码中 我在控制台中得到以下输出 在使用next()或nextFoo()后,从扫描仪查看答案时跳过nextLine()?,我们必须添加Cmd8的原因是,nextInt()一直读取输入,直到将输入发送到程序,并将输入放回输入流的前面。现在,当“Cmd8”中的nextLine()开始读取它时,它会在输入流的开始处发现前面没有任何字符串,它假定用户没有输入任何内容,因此将空字符串作为输入并