Java 当某个生成的代码未使用implements关键字时,是否有方法检查该代码是否符合某个接口?

Java 当某个生成的代码未使用implements关键字时,是否有方法检查该代码是否符合某个接口?,java,interface,code-generation,Java,Interface,Code Generation,我有一些生成的代码无法修改。这也意味着,我不能将implements关键字添加到类声明中 我想实现一个方法,该方法可以获取该类的一个实例,并假设在那里实现了许多方法。理想情况下,这应该由编译器强制执行 我可以在运行时使用反射来实现这一点。但是我试图避免它,因为使用反射的缺点(性能、可读性等等)。我还必须处理运行时错误,而不是编译器错误,以防类不符合接口 class NiceFoo implements Bar { private final Foo delegate; Nice

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

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

我可以在运行时使用反射来实现这一点。但是我试图避免它,因为使用反射的缺点(性能、可读性等等)。我还必须处理运行时错误,而不是编译器错误,以防类不符合接口

class NiceFoo implements Bar {
    private final Foo delegate;

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

    @Override
    void bar() {
        delegate.bar();
    }
}
例如:

  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());
  }
我可以这样称呼:

  someMethod(new Bar()); // I want something similar to this that compiles, Bar adheres to Foo
  someMethod(new Bar2()); // I'd like to have a compile-time error, Bar2 doesn't adhere to Foo

这在Java中可能吗?

将它们封装在一个委托类中,该类实现了接口

class NiceFoo implements Bar {
    private final Foo delegate;

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

    @Override
    void bar() {
        delegate.bar();
    }
}
如果你对样板文件不感兴趣,那就去龙目山营救吧。这完全等同于上述内容,并将自动委托添加到Bar的任何方法。如果Foo没有相关的方法,您将得到一个编译时错误

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

将它们封装在一个实现接口的委托类中

class NiceFoo implements Bar {
    private final Foo delegate;

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

    @Override
    void bar() {
        delegate.bar();
    }
}
如果你对样板文件不感兴趣,那就去龙目山营救吧。这完全等同于上述内容,并将自动委托添加到Bar的任何方法。如果Foo没有相关的方法,您将得到一个编译时错误

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

“未使用implements关键字时实现接口…”如果未使用
implements
关键字,则根据定义不实现接口。您的意思是“碰巧与接口共享相同的方法签名”简短回答:否。您必须
Bar实现Foo
。更准确的简短回答:您可以使用字节码工具开发人员是否知道“类Bar”有一个方法“Foo”,它与“接口Foo”中的方法“Foo”具有相同的签名?是否有许多这样的类“BarA”、“BarB”,它们都有一个方法“foo”(相同的签名),并且您本质上希望创建一个可以对每个“BarN”类进行操作的方法,即使这些类没有公共的对象层次结构(定义“foo”)?您也可以使用反射如果未使用implements关键字,则实现接口…”如果未使用
implements
关键字,则根据定义,它未实现接口。您的意思是“与接口同时共享相同的方法签名”“简短回答:不。您必须
Bar实现Foo
。更准确的简短回答:您可以使用字节码工具开发人员是否知道“类Bar”有一个方法“Foo”,它与“接口Foo”中的方法“Foo”具有相同的签名?”?是否有许多这样的类“BarA”、“BarB”,它们都有一个方法“foo”(相同的签名),并且您本质上希望创建一个可以对每个“BarN”类进行操作的方法,即使这些类没有公共的对象层次结构(定义“foo”)?您也可以使用反射。