java 泛型中的向下转型

DownCasting in generics in java

我被泛型向下转型困住了。因为我学习类型擦除。当代码编译时,所有参数化类型都将转换为上限,如果未定义上限,则它会更改为对象。 一代 Class

public class Gen<T>
{
    T ob;
    
    Gen(T o)
    {
        ob = o;
    }
    
    T getob()
    {
        return ob;
    }
    
    void showType()
    {
        System.out.println("Type of T is: " + ob.getClass().getName());
    }
}

GenDemo Class

public class GenDemo
{
    
    public static void main(String [] args)
    {
        
        Gen<String> strob = new Gen<String>("I am Ahmad");
        
        
        
        String str = strob.getob();
        
        System.out.println("Value of str is: " + str);
    }
}

字符串 str = strob.getob();隐式转换为字符串。 JVM 如何将 strob.getob() 转换为字符串。从 JVM 发现 strob.getob() 的位置向下转换为字符串。因为类型擦除将 return 类型更改为对象。所以在字节码中,getob() 的 return 类型是 object.But 当我调用 getob() 时它会自动向下转换为 string.So 我很困惑通用的向下转换请详细解释我。

是的,在运行时,strob.getob(); 的 return 类型基本上等同于 Object

但是,在编译期间,编译器理解 strob 是一个Gen<String> 并确保添加了所有必要的low-level 操作。所以它基本上把那行 当作 你写的

String str = (String) strob.getob();

换句话说:它将为类型转换生成字节码,即使在源代码中找不到该类型转换。

这也解释了何时由于某种原因通用类型系统被破坏(基本上是通过使用未经检查的强制转换):如果由于 某种原因 getob() 实际上 returns 无法转换为 String 的东西,那么您将得到一个无聊的旧 ClassCastException,就像您尝试将 Integer 转换为 String 一样。