Java,在接口中声明静态方法[重复]

Posted

技术标签:

【中文标题】Java,在接口中声明静态方法[重复]【英文标题】:Java, declaring static methods in interface [duplicate] 【发布时间】:2018-07-10 01:11:50 【问题描述】:

这个主题已经有问题和答案,没有一个具有决定性的结果。如果这是不可能的,那么有人可以确定最佳解决方法吗? 一些答案说 Java 8 可以做到这一点,但我的 IDE (eclipse) 仍然显示错误,即使它设置为编译器合规性 1.8。如果有人可以让它在他们的系统上运行,请告诉我,我会解决我系统的问题。

问题:我需要创建一个包含静态和非静态方法的接口。一个例子:

// I need to create an interface with both static and non-static methods.
public interface TestInterface 

    // No problem
    int objectMethod();

    // static is an illegal modifier in an interface
    static int classMethod();


// TestClass is one of many classes that will implement the interface.
public class TestClass implements TestInterface 

    // static and non-static variables are no problem
    private int objectVal;
    public static int classVal;

    // this method has no problem
    public int objectMethod() 
        return objectVal;
    

    // this one has problems because it implements a method that has problems
    public static int classMethod() 
        return classVal;
    

我需要一个使用实现接口的类的类

// a class that will use classes that implement from the interface
// what is the syntax for this? my IDE doesnt like the implements keyword
public class TestGeneric <T implements TestInterface> 

    // stored instances of the class
    private T t;

    public void foo() 
        System.out.printf("t's value is: %d\n", t.objectMethod());
        System.out.printf("T's value is: %d\n", T.classMethod());
    

上述代码中唯一的问题在于静态方法。我能想到的唯一解决方法是不要将任何方法声明为静态,而是以与静态使用最相似的方式使用它们。

【问题讨论】:

“静态”是“动态”的反义词。所以“静态方法”不能是“动态的”。 静态方法不能是虚拟的。接口允许 Java 8 中的静态方法,但它们应该有方法体。换句话说,你不能有同一个静态方法的多个实现。 自 Java 8 起,您可以在接口中拥有静态方法,但您还需要提供其主体(静态方法不能被覆盖 - 它们可以隐藏 - 所以类实现接口无法为此类方法提供主体,他们所能做的就是创建具有相同签名的单独方法)。也看看Why can't static methods be abstract in Java 您的界面中的static 方法必须有一个主体。 static int classMethod() return 0; 。实现这个接口的类将不能@Override这个方法,因为它是静态的。他们可以通过定义自己的方式重载它,但它将被命名为(例如)TestClass::classMethod(),并且与TestInterface::classMethod() 完全无关。 【参考方案1】:

你最接近你所要求的是:

public interface TestInterface 
    int objectMethod();
    int classMethod();  // Note: not static


public class TestClass implements TestInterface 
    private       int objectVal;
    public static int classVal;

    public int objectMethod()  return objectVal; 
    public int classMethod()   return classVal; 


public class TestGeneric <T extends TestInterface> 
    private T t;

    public void foo() 
        System.out.printf("t's value is: %d\n", t.objectMethod());
        System.out.printf("T's value is: %d\n", t.classMethod());
    

这里,classMethod() 不是静态的,但该方法访问类静态成员,从而为您提供所需的行为。

【讨论】:

这是我想到使用的结果,似乎是最好的解决方法。谢谢

以上是关于Java,在接口中声明静态方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

java8接口默认方法静态方法和重复注解

实际示例何时使用抽象类以及何时使用 Java 8 引入的接口(默认和静态方法)[重复]

java基础第五天_静态代码块类的继承和接口

为啥我不能在接口中声明静态方法?

Java8新特性-----接口中的默认方法和静态方法

java8 新特性2-接口中的默认方法和静态方法