java - 避免类型转换的更好方法?

标签 java inheritance interface casting implementation

我有接口(interface) Foo

public interface Foo {
    public void test();
}

类 FooChild 实现接口(interface) Foo。

public class FooChild implements Foo {

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

    public void test2() {...}
}

我必须在代码的某处调用函数 test2。

Foo f = new FooChild();
((FooChild) f).test2();

我真的很讨厌将接口(interface)强制转换为类。

所以我又加了一个界面Bar。

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

public class FooChild implements Bar {

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

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

现在我调用 test2() 并强制转换为一个接口(interface),而不是一个类。

Foo f = new FooChild();
((Bar) f).test2();

我可能会在接口(interface) Foo 中添加函数 test2, 但是实现 Foo 的类太多了。

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

虽然我可以执行上述操作,但实际上我没有编辑 Foo 的权限。

有没有更奇特的方法来解决这个问题? (希望没有类型转换)

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

正如乔恩所说,我应该更具体一些。 抱歉造成混淆。

public void doSomething(Foo f) {
...
}

最佳答案

如果您知道变量值确实必须FooChild类型,只需这样声明即可:

FooChild f = new FooChild();
f.test2();

如果有什么原因不适合您,那是您没有告诉我们...

编辑:好吧,显然它真的是一个方法参数:

public void doSomething(Foo f) {
    ((FooChild) f).test2();
}

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

关于java - 避免类型转换的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9999048/

相关文章:

java - Java 中方法重写的异常处理没有意义

java - 关于 ContainerBackgroundProcessor 的错误

javascript - 获取 Function.prototype.bind.apply(...) 不是构造函数错误

java - 删除方法二叉搜索树

Java程序,打开包含整数的文件,并打印、计数并显示在输出对话框中。(使用JOptionPane)

C++多级继承函数调用

Python 类到 Yaml/JSON

java - 在 Java 中是否有将 Object 转换为 String 的标准接口(interface)?

java - 慢慢增加 jButton 的大小

c# - 什么时候使用哪种类型的泛型接口(interface)定义?