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,在接口中声明静态方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章