【问题标题】:java class, extending external API functionalityjava类,扩展外部API功能
【发布时间】:2010-01-08 00:24:12
【问题描述】:

我有一个带有“A”类和本地类“B”的外部 API(我不能修改它),它覆盖了“A”的方法并添加了一个附加功能。 我需要根据某个参数“is_A”使用其中之一。

/----- API (A.java) -----/

package A;

public class A {

    public int pingA( int value ) {

        return value;

    }

}

/-----我的班级(B.java)-----/

package B;

import A.*;

public class B extends A {

    @Override
    public int pingA( int value ) {
        return value;
    }

    public int pingB( int value ) {
        return value;
    }

    public static void main(String[] args) {
        final boolean is_A = false;
        A obj;
        if (is_A) {
            obj = new A();
        } else {
            obj = new B();
        }
        if (!is_A) {
            int n = obj.pingB(3);
        }
    }
}

在这种情况下,我想使用类“B”,但命令“int n = obj.pingB(3);”未编译,因为 A 中没有方法 pingB。 确切的信息是:

cannot find symbol
symbol: method pingB(int)
location: class A.A

【问题讨论】:

    标签: java methods extends


    【解决方案1】:

    您在超类中不存在的子类中添加了一个新方法。无法使用对超类的引用来调用子类中的新方法。您必须转换为子类类型才能使用新方法。

    你可以这样做:

    A obj = new B();
    
    if (obj instance of B) {
       B b = (B)obj;
       int n = b.pingB(3);
    }
    

    这里 BAA 不是 B 所以它没有 pingB(int) 方法。

    【讨论】:

      【解决方案2】:

      您需要将cast objB

      if (!is_A) {
          int n = ((B) obj).pingB(3);
      }
      

      顺便说一句,您可以更好地使用instanceof 关键字而不是is_A

      if (obj instanceof B) {
          int n = ((B) obj).pingB(3);
      }
      

      【讨论】:

      • 非常感谢,这行得通。这种方法(我的意思是铸造)是否会影响处理速度?
      【解决方案3】:

      您需要转换为派生类才能调用它的方法。通常这是用 if( obj instanceof B ) 完成的,但由于你已经有了一个包含该信息的布尔值,它看起来像这样:

      public static void main(String[] args) { 
          final boolean is_A = false; 
          A obj; 
          if (is_A) { 
              obj = new A(); 
          } else { 
              obj = new B(); 
          } 
          if (!is_A) { 
              int n = ((B) obj).pingB(3); 
          } 
      }
      

      【讨论】:

        【解决方案4】:

        obj 仍然具有类型 A (-> 您声明了 A obj;) -> 这样类型绑定不适用于编译。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-10
          • 2015-12-04
          • 1970-01-01
          • 2013-08-29
          相关资源
          最近更新 更多