无法执行类型转换 - 不兼容的类型,int 无法转换为 c2

Unable to perform typecasting -incompatible type, int cannot be converted to c2

这是我写的一个简单的代码:

class c1
{
    int x = 10;
}
class c2 extends c1
{
    int x = 20;
}
class c3
{
    public static void main(String [] args)
    {
        c1 a = new c2(); 
        System.out.println(a.x); //This works and output is 10.
        System.out.println((c2)a.x); //Error is here
    }
}

错误说,

incompatible type, int cannot be converted to c2

我确信代码是正确的。 由于引用类型 a 已转换为 c2(在显示错误的语句中),因此应显示 20。

但是,类型转换并没有发生。 为什么?

应该是((c2) a).x

你需要有一个额外的括号才有意义。因为编译器认为您正在尝试将整个事情转换为 c2。

System.out.println(((c2) a).x);

目前,您正在尝试将 a.x 转换为整数 C2。 因为你需要将 c1 转换为 c2 try

   System.out.println((c2)a)).x;

您没有使用 (c2)a.x 将 c1 转换为 c2,而是将整数 x 转换为 c2,因此出现错误。

这是运算符优先级的问题(cast 与 dot),不幸的是 JLS 不认为这些是运算符,因此不会在 table 中公布它们的优先级。这是优先级:

  • new 运算符具有最高优先级:new A().foo(); 表示 (new A()).foo();
  • 点运算符的优先级高于强制转换运算符:(double)a.x表示(double)(a.x)

Java 程序员不将它们称为 "operators",但在其他语言中它们是。所以对于来自其他语言的读者来说,这很有意义。

首先,我想在这一行纠正你..

I am sure the code is correct.

不,代码不正确。

我已尝试逐步解释您的代码,并将概念作为代码中的注释。

public static void main(String [] args)
{
    c1 a; // this is just a reference of Type 'c1', holding nothing.
    a = new c2(); // assigned new Object of Type 'c2', perfectly fine, no issues with polymorphism.
    /* but here,
     c2 has value of 'x' as 20;
     but when if you use the reference of 'a' (which is of type c1), i.e. 'c1.x' then JVM follows the reference.
     Meaning to say is, it will go to class 'c1' and print it's value of 'x' which is 10 & you are getting the same.

    */
    System.out.println((long)a.x); //This works and output is 10.
    /*
     your code, (c2)a.x
     Now, Problem starts here,
     'a.x' is of type 'int', and you are casting this 'int' to type 'c2',
     you will have to convert the reference of 'a' to 'c2'
     (i.e 'a' of type 'c1' to 'a' of type 'c2', not 'a.x' to type of 'c2').
     So the solution would be, ((c2)a) <---- this is now of type 'c2', now access it's member 'x', it will show you value 20.


     */

    System.out.println((c2)a.x); //Error is here
}

您应该在 java.

中阅读这两个与转换相关的答案

1)

2)