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