相关疑难解决方法(0)

为什么我不能在Java接口中定义静态方法?

这是一个例子:

public interface IXMLizable<T>
{
  static T newInstanceFromXML(Element e);
  Element toXMLElement();
}
Run Code Online (Sandbox Code Playgroud)

当然这不会奏效.但为什么不呢?

其中一个可能的问题是,当您致电时会发生什么:

IXMLizable.newInstanceFromXML(e);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我认为它应该只调用一个空方法(即{}).所有子类都将被强制实现静态方法,因此在调用静态方法时它们都会很好.那么为什么这不可能呢?

编辑:我想我正在寻找比"因为这就是Java的方式"更深层次的答案.

是否有一个特殊的技术原因导致静态方法无法被覆盖?也就是说,为什么Java的设计者决定使实例方法可覆盖但不是静态方法?

编辑:我的设计的问题是我正在尝试使用接口来强制执行编码约定.

也就是说,界面的目标是双重的:

  1. 我希望IXMLizable接口允许我将实现它的类转换为XML元素(使用多态,工作正常).

  2. 如果有人想要创建一个实现IXMLizable接口的类的新实例,他们将始终知道将有一个newInstanceFromXML(Element e)静态构造函数.

除了在界面中添加评论之外,还有其他方法可以确保这一点吗?

编辑: 从Java 8开始,接口中现在允许使用静态方法.

java static-methods interface

480
推荐指数
10
解决办法
33万
查看次数

Resteasy和Google Guice:如何在@Injection中使用多个@ApplicationPath和资源?

我使用Resteasy 创建了一个项目来测试Google Guice在我的Jax-rs资源中提供的依赖注入.

我的意图是:

  • @ApplicationPath对我的API版本使用multiple .在每个用@ApplicationPathI 注释的类中,为特定版本加载一组类.
  • 每个资源都有一个@Inject(来自Google Guice)在他的构造函数中注入一些服务.

我创建了两个带有注释的类@ApplicationPath:ApplicationV1RSApplicationV2RS.在这两个中我添加了相同的资源类(UserResourceHelloResource),仅用于我的测试.

我的模块配置如下:

public class HelloModule implements Module
{
   public void configure(final Binder binder)
   {
      binder.bind(IGreeterService.class).to(GreeterService.class);

      binder.bind(IUserService.class).to(UserService.class);
   }
}
Run Code Online (Sandbox Code Playgroud)

当我打电话http://localhost:9095/v1/hello/worldhttp://localhost:9095/v2/hello/world,我收到同样的错误:

java.lang.RuntimeException: RESTEASY003190: Could not find constructor 
    for class: org.jboss.resteasy.examples.guice.hello.HelloResource
Run Code Online (Sandbox Code Playgroud)

好吧,正如我所料,这不起作用.对于我来说,使用construtor实例化资源类并不是"聪明"的.

但我找不到办法.说实话,我真的很困惑Google Guice,Jetty和Resteasy在这种情况下如何互相玩耍.

如果我放弃使用的想法@ApplicationPath,我的资源与Google Guice一起配置我HelloModule这样:

public class HelloModule implements Module
{
   public void configure(final Binder binder)
   {
      binder.bind(HelloResource.class);
      binder.bind(IGreeterService.class).to(GreeterService.class); …
Run Code Online (Sandbox Code Playgroud)

jax-rs guice embedded-jetty resteasy

8
推荐指数
1
解决办法
1088
查看次数