我有一个由接口定义的类
public interface Test {
void testMethod();
}
Test test = new TestImpl();
public class TestImpl implements Test {
@Override
public void testMethod() {
//Nothing to do here
}
public void anotherMethod() {
//I am adding this method in the implementation only.
}
}
我怎样才能调用anotherMethod?
test.anotherMethod(); //Does not work.
我只想在实现中定义一些方法,因为在我的生产代码中,Test接口涵盖了相当广泛的类,并由多个类实现。我使用在实现中定义的方法来设置单元测试中DI框架未涵盖的依赖项,因此方法在实现之间会有所不同。
最佳答案
问题在于以下行:
Test test = new TestImpl();
这告诉编译器忘记新对象是TestImpl并将其视为普通的旧Test。如您所知,Test没有anotherMethod()。
您所做的称为“向上转换”(将对象转换为更通用的类型)。正如另一位发帖人所说的,您可以通过不up缩来解决问题:
TestImpl test = new TestImpl();
如果确定Test对象确实是TestImpl,则可以将其向下转换(告诉编译器它是更特定的类型):
Test test = new TestImpl();
:
((TestImpl) test).anotherMethod();
但是,这通常是一个坏主意,因为它可能导致ClassCastException。使用编译器,而不是反对编译器。