这是一个例子:
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的设计者决定使实例方法可覆盖但不是静态方法?
编辑:我的设计的问题是我正在尝试使用接口来强制执行编码约定.
也就是说,界面的目标是双重的:
我希望IXMLizable接口允许我将实现它的类转换为XML元素(使用多态,工作正常).
如果有人想要创建一个实现IXMLizable接口的类的新实例,他们将始终知道将有一个newInstanceFromXML(Element e)静态构造函数.
除了在界面中添加评论之外,还有其他方法可以确保这一点吗?
编辑: 从Java 8开始,接口中现在允许使用静态方法.
我使用Resteasy 创建了一个项目来测试Google Guice在我的Jax-rs资源中提供的依赖注入.
我的意图是:
@ApplicationPath
对我的API版本使用multiple .在每个用@ApplicationPath
I 注释的类中,为特定版本加载一组类.@Inject
(来自Google Guice)在他的构造函数中注入一些服务.我创建了两个带有注释的类@ApplicationPath
:ApplicationV1RS
和ApplicationV2RS
.在这两个中我添加了相同的资源类(UserResource
和HelloResource
),仅用于我的测试.
我的模块配置如下:
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/world
或http://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)