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

标签 java generics incompatibletypeerror

我所做的只是了解泛型在 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/

相关文章:

java - 如何在 Java 中创建类型安全的泛型数组?

c - [-Win 兼容指针类型]。不知道是什么问题

java - 内部类泛型 - 不兼容的类型

java - 托管用 struts2 制作的 java 网站后尝试执行操作类时出错

java - 使用 lambda 迭代集合时使用 setter 方法

java - 为泛型类的每个类型参数创建单独的单例的最佳习惯用法?

c# - StructureMap 3 中开放泛型的装饰器拦截

java - 方法上的类型不兼容

java - 如何在 PreferenceChangeListener 中启动 Intent

java - Mockito WrongTypeOfReturnValue 可迭​​代而不是列表