我有一组实现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中使用它?
答案 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
方法也可以是静态的。它可能只是非静态的,允许不同的实现。
如果你真的坚持静态方法,谢尔盖拉古丁是正确的,反思将解决你的问题。但同样,它变得越来越复杂,我不明白为什么你应该想要这样的解决方案。