我有接口(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/