Java,在接口

时间:2018-01-31 02:20:39

标签: java templates methods interface static

这个主题已经有问题和答案,没有一个具有决定性的结果。如果这是不可能的,那么有人可以确定最佳解决方法吗? 一些答案说这可以用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());
    }
}

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

1 个答案:

答案 0 :(得分:-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()不是静态的,但是该方法访问类静态成员,为您提供所需的行为。