在 class 本身中初始化通用类型字段
Initializing generic type fields in the class itself
这是代码...
public class Dog {
}
public class Bird {
}
public class Animal< T > {
T field1 = (T) new Bird(); // unchecked cast : Bird to T
public void display() {
System.out.println(field1);
}
}
我原以为 运行 时间错误,但 运行 没问题....
它给我输出:
com.company.Bird@48140564
主要class
public static void main(){
Animal<Dog> animal = new Animal();
animal.display(); // I was expecting run time error here
}
它没有出错,因为代码仍然是 "valid"。 Java 泛型是一种处理对象转换和改进类型检查的奇特方法。每次使用泛型时,编译代码时 Java 都会将它们转换为显式转换。主要原因与引入泛型之前的 Java 版本有关,因此 Java 像 "Object" class 一样处理它们,然后在需要时为您转换。
例如,在您的 .java 文件中编写以下代码:
String hello = new String();
ArrayList<String> list = new ArrayList<>();
list.add(hello);
Object noCastRequired = list.get(0);
String castRequired = list.get(0);
在其相关的 .class 文件中,Java 将写入:
String hello = new String();
ArrayList<String> list = new ArrayList();
list.add(hello);
Object noCastRequired = list.get(0);
String castRequired = (String)list.get(0);
如果您要检查编译后的代码,您会发现表达式仍然是一个有效的代码语句,但是如果您尝试 "use" 中的那个字段,您将会遇到错误和麻烦需要 "type" 的方法; print语句接受一个对象class一个参数,所以Java不会强制转换它。
示例:
class Scratch {
public static void main(String[] args) {
Root<FirstLevel> correct = new Root<>();
Root<FirstLevelChild> iAmNotValid = new Root<>(); // No error
Root<SecondLevel> iAmNotValidToo = new Root<>(); // No error
System.out.println(correct.field.first); // Ok
System.out.println(iAmNotValid.field.first); // Ko, because java.lang.ClassCastException: FirstLevel cannot be cast to FirstLevelChild
System.out.println(iAmNotValidToo.field.second);
}
}
class Root<T> {
public T field = (T) new FirstLevel();
}
class FirstLevel {
public String first = "First";
}
class SecondLevel {
public String second = "Second";
}
class FirstLevelChild extends FirstLevel {
}
这是代码...
public class Dog {
}
public class Bird {
}
public class Animal< T > {
T field1 = (T) new Bird(); // unchecked cast : Bird to T
public void display() {
System.out.println(field1);
}
}
我原以为 运行 时间错误,但 运行 没问题....
它给我输出:
com.company.Bird@48140564
主要class
public static void main(){
Animal<Dog> animal = new Animal();
animal.display(); // I was expecting run time error here
}
它没有出错,因为代码仍然是 "valid"。 Java 泛型是一种处理对象转换和改进类型检查的奇特方法。每次使用泛型时,编译代码时 Java 都会将它们转换为显式转换。主要原因与引入泛型之前的 Java 版本有关,因此 Java 像 "Object" class 一样处理它们,然后在需要时为您转换。
例如,在您的 .java 文件中编写以下代码:
String hello = new String();
ArrayList<String> list = new ArrayList<>();
list.add(hello);
Object noCastRequired = list.get(0);
String castRequired = list.get(0);
在其相关的 .class 文件中,Java 将写入:
String hello = new String();
ArrayList<String> list = new ArrayList();
list.add(hello);
Object noCastRequired = list.get(0);
String castRequired = (String)list.get(0);
如果您要检查编译后的代码,您会发现表达式仍然是一个有效的代码语句,但是如果您尝试 "use" 中的那个字段,您将会遇到错误和麻烦需要 "type" 的方法; print语句接受一个对象class一个参数,所以Java不会强制转换它。
示例:
class Scratch {
public static void main(String[] args) {
Root<FirstLevel> correct = new Root<>();
Root<FirstLevelChild> iAmNotValid = new Root<>(); // No error
Root<SecondLevel> iAmNotValidToo = new Root<>(); // No error
System.out.println(correct.field.first); // Ok
System.out.println(iAmNotValid.field.first); // Ko, because java.lang.ClassCastException: FirstLevel cannot be cast to FirstLevelChild
System.out.println(iAmNotValidToo.field.second);
}
}
class Root<T> {
public T field = (T) new FirstLevel();
}
class FirstLevel {
public String first = "First";
}
class SecondLevel {
public String second = "Second";
}
class FirstLevelChild extends FirstLevel {
}