java - Java 赋值期间的转换

标签 java casting

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/

相关文章:

java - 连接到 https 站点时发生 SSLHandshakeException

java - 连接到 GlassFish 或 JBoss 的实时应用程序

c# - 当值类型可以相互转换时,为什么我不能将一种值类型的字典转换为另一种值类型的字典?

c++ - 无法将 'a'(类型 'int')转换为类型“double&”

java - Recaptcha 验证 : IOException : Tried all: 1 addresses, 但无法通过 HTTPS 连接到服务器 : google. com 端口:443

java - 如何告诉主线程部分线程工作已完成

java - 如何处置 JFileChooser

ios - 我可以在 "for in"控制结构中使用 Swift 向下转换吗?

c++ - static_cast<int>(foo) 与 (int)foo

c++ - 函数式转换被认为是有害的?