我可以在泛型类参数上调用静态方法

时间:2018-02-05 10:57:22

标签: java java-8

我有一组实现RaeInterface

的类
public interface RaeInterface {
    public static String SCHEMA_ID(){return ""; };
}

每个实现类都定义了不同的SCHEMA_ID()

我想将类传递给方法并在类上使用静态SCHEMA_ID()方法。我可以将类传递给一个方法,但是获取静态SCHEMA_ID()会令人沮丧地难以理解。

public <T extends RaeInterface> void get( Class klass){
   klass.SCHEMA_ID(); // <-- cannot resolve method.
}

有关如何解决此问题的任何建议,或者甚至可以在Java 8中使用它?

2 个答案:

答案 0 :(得分:2)

静态方法无法在接口的实现中覆盖。如果要覆盖接口中的使用默认方法。

界面:

     public interface RaeInterface {
        default String SCHEMA_ID() {
          return "";
        }
      }

你的提及方法:

        public <T extends RaeInterface> void get(T klass) {
          klass.SCHEMA_ID();
        }

实施课程:

      class B implements RaeInterface {
        @Override
        public String SCHEMA_ID() {

          return "B";//the ID
        }
      }

      class C implements RaeInterface {
        @Override
        public String SCHEMA_ID() {

          return "C";//the ID
        }
      }

答案 1 :(得分:2)

我认为您需要在界面中使用实例方法:

public String schemaId();

每个实现类都可以(如果不是抽象的话)实现此方法。它不需要使用任何实例的东西来实现。

您的调用方法变得更简单,不需要任何泛型:

public void get(RaeInterface instance){
    instance.schemaId();
}

您可以查看如何使用java.util.Comparator界面。通常,实现此接口的类不包含任何实例变量,因此您认为compare方法也可以是静态的。它可能只是非静态的,允许不同的实现。

如果你真的坚持静态方法,谢尔盖拉古丁是正确的,反思将解决你的问题。但同样,它变得越来越复杂,我不明白为什么你应该想要这样的解决方案。