更好的避免施法的方法?

Hee*_*jin 1 java inheritance implementation casting interface

我有界面Foo

public interface Foo {
    public void test();
}
Run Code Online (Sandbox Code Playgroud)

类FooChild实现了接口Foo.

public class FooChild implements Foo {

    @Override
    public void test() {...}

    public void test2() {...}
}
Run Code Online (Sandbox Code Playgroud)

我必须在代码中的某个地方调用函数test2.

Foo f = new FooChild();
((FooChild) f).test2();
Run Code Online (Sandbox Code Playgroud)

我真的很讨厌将类接口转换为类.

所以我添加了另一个界面栏.

public interface Bar extends Foo {
    public void test2();
}

public class FooChild implements Bar {

    @Override
    public void test() {...}

    @Override
    public void test2() {...}
}
Run Code Online (Sandbox Code Playgroud)

现在我将test2()调用为接口而不是类.

Foo f = new FooChild();
((Bar) f).test2();
Run Code Online (Sandbox Code Playgroud)

我可以将函数test2添加到接口Foo,但实现Foo的类太多了.

如果我添加该函数,我必须向所有实现Foo的类添加代码.

虽然我可以这样做,但实际上我没有编辑Foo的权限.

有没有更好的方法来解决这个问题?(希望没有铸造)

编辑:f作为方法参数传递.

正如乔恩所说,我应该更加具体.对困惑感到抱歉.

public void doSomething(Foo f) {
...
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

如果您知道变量值确实必须是类型FooChild,那么只需声明它:

FooChild f = new FooChild();
f.test2();
Run Code Online (Sandbox Code Playgroud)

如果有什么理由不适合你,那就是你没有告诉我们的事情......

编辑:好的,显然这是一个方法参数:

public void doSomething(Foo f) {
    ((FooChild) f).test2();
}
Run Code Online (Sandbox Code Playgroud)

......所以不,你无能为力,以避免演员表演.演员表示超出声明的变量类型已经保证的值的要求 - 在这种情况下,你想说"它必须实际上是一个FooChild,而不仅仅是任何实现Foo." 如果您无法更改参数,则转换是表达方式.


Eug*_*sky 5

Bar f = new FooChild();
f.test2();
Run Code Online (Sandbox Code Playgroud)