如果我有这样的类层次结构
If I have a class hierarchy like this
AbstractSuperClass ConcreteClassA ConcreteClassB是否有可能在 AbstractSuperClass 中使用静态方法返回
is it possible to have a static method in AbstractSuperClass which returns the class - not an instance - of one of the two concrete classes?
我尝试返回 Class< AbstractSuperClass> ,但IDE(Android Studio)表示
I've tried returning Class<AbstractSuperClass>, but the IDE (Android Studio) says
Incompatible types. Required: Class <com.example.AbstractSuperClass> Found: Class <com.example.ConcreteClassA>这是我在想的一个例子,但是没有用:
Here's an example of what I'm thinking, but which isn't working:
public abstract class AbstractSuperClass{ public abstract void someAbstractMethod(); public static String getSomeText(){ return "This is AbstractSuperClass"; }; public static Class<AbstractSuperClass> getConcreteClass(int x){ switch( x ){ case 0: return ConcreteClassA.class; case 1: return ConcreteClassB.class; } } } public class ConcreteClassA extends AbstractSuperClass{ public abstract void someAbstractMethod(){ // Do something } public static String getSomeText(){ return "This is ConcreteClassA"; }; } public class ConcreteClassB extends AbstractSuperClass{ public abstract void someAbstractMethod(){ // Do something } public static String getSomeText(){ return "This is ConcreteClassB"; }; } AbstractSuperClass.getConcreteClass(1).getSomeText(); // Should return "This is ConcreteClassB"在Java中这是根本不可能的,还是我只是在做
Is this simply impossible in Java, or am I just doing it wrong?
推荐答案我不确定它需要什么,但是您的代码中存在几个问题。
I'm not sure what it is needed for, but there are several issues in your code.
您不能直接从class调用any(无关紧要的静态方法或非静态方法) 。您需要使用反射API,所以您的方法调用将如下所示:
You can not call the any (doesn't matter static or not static method) directly from class. You need to use the reflections API, so you method call will look like this:
最终类clazz = AbstractSuperClass.getConcreteClass(1); 对象结果= clazz.getMethod( getSomeText)。invoke(clazz);
final Class clazz = AbstractSuperClass.getConcreteClass(1); Object result = clazz.getMethod("getSomeText").invoke(clazz);
package com.mycompany.sandbox; import java.lang.reflect.InvocationTargetException; import java.util.Objects; import java.util.logging.Level; import java.util.logging.Logger; abstract class AbstractSuperClass{ public abstract void someAbstractMethod(); public static String getSomeText(){ return "This is AbstractSuperClass"; }; public static Class<? extends AbstractSuperClass> getConcreteClass(int x){ switch( x ){ case 0: return ConcreteClassA.class; case 1: return ConcreteClassB.class; } return null; } } class ConcreteClassA extends AbstractSuperClass{ public void someAbstractMethod(){ // Do something } public static String getSomeText(){ return "This is ConcreteClassA"; }; } class ConcreteClassB extends AbstractSuperClass{ public void someAbstractMethod(){ // Do something } public static String getSomeText(){ return "This is ConcreteClassB"; }; } // one class needs to have a main() method public class HelloWorld { // arguments are passed using the text field below this editor public static void main(String args[]) { try { final Class<? extends AbstractSuperClass> clazz = AbstractSuperClass.getConcreteClass(1); Object result = clazz.getMethod("getSomeText").invoke(clazz); System.out.println(Objects.toString(result, "<NULL>")); } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) { Logger.getLogger(HelloWorld.class.getName()).log(Level.SEVERE, null, ex); } } }
更多推荐
返回扩展抽象基类的具体类的类,而不是实例?
发布评论