Java 中变量赋值期间是否有使用强制转换?
例如,我有两个类,Person 和 Student,它们继承自 person:
- 人| -id:整数
- 学生 -> 人 | -gpa:双倍
然后在主要部分我有以下代码:
Student S = new Student(1, 4.00);
Person P = (Student)S;
System.out.println(P.getId() + " " + ((Student)P).getGpa());
IntelliJ 告诉我,P = (Student)S
中的转换是多余的,如果我在调用 getGpa 方法时进行转换,它就可以工作:
Student S = new Student(1, 4.00);
Person P = S;
System.out.println(P.getId() + " " + ((Student)P).getGpa());
但是,如果我在分配期间进行转换,但在调用 getGpa 时不会再次出现错误:
Student S = new Student(1, 4.00);
Person P = (Student)S;
System.out.println(P.getId() + " " + P.getGpa());
所以我的问题是 - 在分配期间进行转换是否有用?或者它是否允许但总是多余的,因为您仍然必须在每个方法调用中告诉编译器您正在转换为子类型?
感谢您的帮助。
最佳答案
当您知道编译器不知道的事情时,赋值期间的转换并不是多余的。
当您将 Student
对象分配给 Person
变量时,无需进行强制转换,因为编译器知道 Student
继承自 Person
。但是,如果您将 Person
对象分配给 Student
变量,编译器不知道 Person
对象是否也是 Student
> 对象。
在这种情况下,您必须在赋值期间使用强制转换来告诉编译器您知道这个特定的 Person
对象也是 Student
。您通常会首先使用 instanceof
进行验证。
if (P instanceof Student) {
Student S2 = (Student) P; // here the casting during assignment is required
S2.getGpa();
}
关于java - Java 赋值期间的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36379427/