【问题标题】:How can I do a safe downcast and prevent a ClassCastException如何进行安全的向下转换并防止 ClassCastException
【发布时间】:2010-07-24 13:30:07
【问题描述】:

我有以下场景:

public class A {
}

public class B extends A {
}

public class C extends B {
    public void Foo();
}

我有一个可以返回类 A、B 或 C 的方法,我想安全地转换为 C,但前提是类类型是 C。这是因为我需要调用 Foo() 但我不想要 ClassCastException。

【问题讨论】:

标签: java casting downcast


【解决方案1】:

你能做到吗?

if (obj instanceof C) {
   ((C)obj).Foo();
}
else {
   // Recover somehow...
}

但是,请查看此问题中的其他一些 cmets,因为过度使用 instanceof 有时(并非总是)表明您需要重新考虑您的设计。

【讨论】:

  • 谢谢,我会考虑改变我的设计。只是它添加了很多样板以始终使用 C 类型。
  • instanceof 就像 goto,如果你使用它,那么你需要花时间重构你的源代码:)
【解决方案2】:

您可以在使用 instanceof 进行转换之前检查类型

Object obj = getAB_Or_C();

if ( obj instanceof C ) {
  C c = (C) obj;
}

【讨论】:

    【解决方案3】:

    你应该做的是类似下面的事情,那么你就不需要投射了。

    public class A { 
        public void foo() {
            // default behaviour.
        }
    } 
    
    public class B extends A { 
    } 
    
    public class C extends B { 
        public void foo() {
           // implementation for C.
        }
    } 
    

    【讨论】:

    • 有时,有时不是。 A 有一个方法 foo() 并不总是有意义的,你可能无法更改 A 类。
    • 我无法更改 A 类 - 它是 GWT UI 包的一部分。
    【解决方案4】:

    作为instanceof 的替代方案,考虑

    interface Fooable { void foo(); }
    
    class A implements Fooable { ... }
    

    【讨论】:

      猜你喜欢
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      相关资源
      最近更新 更多