相关疑难解决方法(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万
查看次数

为什么接口中的变量不会出现在类实现中?

单击实现方法时,为什么界面中列出的变量不会显示在类中?我看,我没有看到我真正想要的答案,或者变量更像是属性?

类:

public class TestInterface implements myInterable {

    public TestInterface() {
    }

    public static void main(String[] args) {


    }

    @Override
    public void method1() {


    }

    @Override
    public void method2() {


    }
}

interface myInterable {
    public int score = 0;
    public void method1();
    public abstract void method2();
}
Run Code Online (Sandbox Code Playgroud)

试过这段代码,但不行.它几乎与列出的Oracle教程中的示例完全相同.

例:

interface TimeClient {
    void setTime(int hour, int minute, int second);
    void setDate(int day, int month, int year);
    void setDateAndTime(int day, int month, int year, int hour, int minute, int second); …
Run Code Online (Sandbox Code Playgroud)

java

0
推荐指数
1
解决办法
96
查看次数

标签 统计

java ×2

interface ×1

static-methods ×1