我有一个由接口定义的类

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。使用编译器,而不是反对编译器。

10-06 09:23