当不使用Implements关键字时,是否可以检查某些生成的代码是否遵守接口?

时间:2019-03-27 13:19:13

标签: java interface code-generation

我有一些无法修改的代码。这也意味着,我无法将Implements关键字添加到类声明中。

我想实现一个方法,该方法可以采用该类的实例,并假设在那里实现了许多方法。理想情况下,应由编译器强制执行

我可以在运行时使用反射来做到这一点。但是由于使用反射的缺点(性能,可读性等),我试图避免这种情况。如果一个类不遵守接口,我还必须处理运行时错误而不是编译器错误。

示例:

replace(field("adft.ati", String.class), inline(":"), inline(""))

现在我有一些方法:

  public interface Foo {
    boolean foo();
  }

  public class Bar {
    // Doesn't implement Foo interface but adheres to it
    boolean foo() {
      return true;
    }
  }

  public class Bar2 {
    // Doesn't implement or adhere to interface
    boolean bar() {
      return false;
    }
  }

我可以这样称呼:

  public someMethod(Foo foo) {
    System.out.println(foo.foo());
  }

这在Java中可行吗?

1 个答案:

答案 0 :(得分:2)

将它们包装在确实实现接口的委托类中。

class NiceFoo implements Bar {
    private final Foo delegate;

    NiceFoo(final Foo delegate) {
        this.delegate = delegate;
    }

    @Override
    void bar() {
        delegate.bar();
    }
}

如果您不喜欢样板,请龙目岛(Lombok)营救。这与上述完全等效,并且将自动委派添加到Bar中的所有方法。如果Foo没有相关方法,则会出现编译时错误。

@AllArgsConstructor
class NiceFoo implements Bar {
    @Delegate(types = Bar.class)
    private final Foo foo;
}