避免instanceof - 不可修改的类

0 java instanceof

假设我有两个班A,并B使得B extends A分别实现方法getA,并getB具有相同的输入参数类型和相同的返回类型(但不同的名称).在方法public static <T extends A> void print(T t)得到作为输入类型的对象AB,我想调用getA如果对象是类的A或者getB如果对象是类的B.

如果我能编辑的代码AB我想使他们实现一个接口I提供getValue()(在实施AB,getValue()会叫木屐()和getB()RESP),然后调用此方法print().问题是:A类和B类不可修改!.没有方法可以添加或更改,它们的类层次结构是固定的,我没有编写他们的代码,我也没有访问源代码.

请注意,这也适用于案件的时候-以任何理由-我不希望改变的代码AB.

有没有办法在没有使用的情况下这样做instanceof

以下是使用instanceof(坏!)的解决方案.

public class Test {

    public static <T extends A> void print(T t){
        if (t instanceof B)
            System.out.println(((B)t).getB());
        else if (t instanceof A)
            System.out.println(t.getA());
    }

    public static class A {
        public String getA(){
            return "A";
        }
    }
    public static class B extends A {
        public String getB(){
            return "B";
        }
    }
Run Code Online (Sandbox Code Playgroud)

}

Mat*_*att 5

当您因任何原因无法访问原始代码时,您最终不得不依赖于instanceof之类的东西.在这些情况下,它本身并不坏 - 你的双手并列.

我要做的是创建一个在你的T上通用化的包装类,按照你的建议给它一个getValue测试instanceof,并明确表示这个类存在唯一原因是提供一个一致的接口来使用A或a B.它仍然很严重,但是你已经在一个地方包含了粗糙度.