在java中向上转换

sim*_*mao 3 java casting

在Java中,假设我有3个类,C从B扩展而来自A.

class X {
   interface A {}
   interface B extends A {}
   interface C extends B {}
   void f(A a) {}

   void test() {
      C c = new C()
      B b = (B) c;

      f(b);
   }
}
Run Code Online (Sandbox Code Playgroud)

如果我做了类似这样的事情,如上所示test():

C c = new C()
B b = (B) c;

f(b);
Run Code Online (Sandbox Code Playgroud)

f()从那时起接受b类型C,CB从两者延伸A.我希望f()收到b类型B而不是类型C.

无论如何迫使这种向上倾斜?

Bri*_*new 9

f()始终收到类似A的东西(尽管在封面下它实际上是B或C,并且可以适当地向下倾斜).

您可以定义一个额外的f()

f(B b);
Run Code Online (Sandbox Code Playgroud)

如果有必要的话

f(C c);
Run Code Online (Sandbox Code Playgroud)

并且将根据参数的类调用正确的一个.即编译器根据参数的类型确定调用哪个函数.这与运行时发生的动态调度(或多态)不同.

请注意,您在问题中的演员阵容是多余的.你可以写:

C c = new C()
B b = c;

f(b);
Run Code Online (Sandbox Code Playgroud)

由于C从B延伸,C B.