gpt4 book ai didi

java - Class T 如何以及何时从 Integer 更改为 String 而不是显示错误/异常

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:27:53 27 4
gpt4 key购买 nike

我所做的只是了解泛型在 Java 中的工作原理。我写了下面的代码:

public class Test {

public static void main(String... args) throws Exception{
Foo o = new Foo<Integer>(new Integer(5));
o.fun();
}
}

class Foo<T> {

private T t;

public Foo(T t) throws InstantiationException, IllegalAccessException{
System.out.println("1. T is "+t.getClass());
this.t = (T)"test";
System.out.println("2. T is "+t.getClass());
}

void fun(){
System.out.println("3. T is "+t.getClass()+" t = "+t);
}
}

输出是

1. T is class java.lang.Integer
2. T is Still class java.lang.Integer
3. T is class java.lang.String t = test

我的问题是为什么这会将 Class 从 Integer 更改为 String 而没有显示错误/异常。

第二件事是,当我在 function fun() 中编写 t = 9; 时,它显示:

incompatible types
required: T
found: java.lang.Integer

泛型类如何工作以及如何使用它们?

非常感谢您的回复!!

最佳答案

您已使用 no upper bound 声明了一个泛型.替换无界泛型是Object本身

这意味着,当生成类文件时,您的 Foo<T>类看起来像这样

class Foo {

private Object t;

public Foo(Object t) throws InstantiationException, IllegalAccessException{
System.out.println("1. T is "+t.getClass());
this.t = (Object)"test";
System.out.println("2. T is "+t.getClass());
}

void fun(){
System.out.println("3. T is "+t.getClass()+" t = "+t);
}
}

这是因为泛型只是为了确保编译时类型安全。在运行时它们被删除

考虑到这一点

this.t = (Object)"test";

是一个有效的陈述,因为 Object是所有类的父类(super class)并且this.t然后变成String

2. T is Still class java.lang.Integer的原因,

  • 在这里t是一个构造函数的参数并且该参数仍然指向Integer (不被覆盖)
  • 并且参数优先于this.t

关于java - Class T 如何以及何时从 Integer 更改为 String 而不是显示错误/异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20279446/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com