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

时间:2018-01-02 07:21:16

标签: java typecasting-operator

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

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.3/FileSaver.js"></script>
<canvas id='canvas'></canvas>
<a id='a'>click me to save</a>

错误说,

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
    }
}

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

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

5 个答案:

答案 0 :(得分:6)

应为((c2) a).x

你需要有一个额外的括号才有意义。因为编译器认为你试图将整个事情都归结为c2。

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

答案 1 :(得分:1)

这是运算符优先级(强制转换为点)的问题,但不幸的是,JLS并不认为这些是运算符,因此不会在表中发布它们的优先级。这里有优先权:

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

这些不被称为&#34;运营商&#34;由Java程序员,但在其他语言中,他们是。所以对于来自其他语言的读者来说,这是有道理的。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

您没有使用 // Stream data from input topic builder.stream(Serdes.String(), Serdes.String(), inTopic) // convert csv data to avro .transformValues(new TransformSupplier()) // post converted data to output topic .to(Serdes.String(), Serdes.ByteArray(), outTopic); 将c1转换为c2,您将整数x转换为c2,因此出错。

答案 4 :(得分:0)

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

  

我确信代码是正确的。

不,代码不正确。

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

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)https://stackoverflow.com/a/30776990

2)https://stackoverflow.com/a/1302612