java - 返回扩展抽象基类的具体类的类而不是实例?
问题描述
如果我有这样的类层次结构
AbstractSuperClass
ConcreteClassA
ConcreteClassB
是否有可能有一个静态方法AbstractSuperClass
返回两个具体类之一的类 - 而不是实例?
我试过返回Class<AbstractSuperClass>
,但 IDE (Android Studio) 说
Incompatible types.
Required: Class <com.example.AbstractSuperClass>
Found: Class <com.example.ConcreteClassA>
这是我在想的一个例子,但它不起作用:
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中是不可能的,还是我做错了?
解决方案
您不能static
直接从Class
您尝试执行的操作中调用方法,您需要反射来调用您的getSomeText()
方法。像,
try {
Method m = AbstractSuperClass.getConcreteClass(1).getMethod("getSomeText",
new Class[0]);
System.out.println(m.invoke(null, new Object[0]));
} catch (Exception e) {
e.printStackTrace();
}
getConcreteClass
然后您可以通过使用捕获扩展AbstractSuperClass
(生产者扩展,消费者超级)来修复您的方法。对于没有匹配项的情况,您必须有一个默认返回。像,
public static Class<? extends AbstractSuperClass> getConcreteClass(int x) {
switch (x) {
case 0: return ConcreteClassA.class;
case 1: return ConcreteClassB.class;
}
return null;
}
我跑了(得到了)
This is ConcreteClassB
推荐阅读
- javascript - 为什么组件没有道具?
- python - 我的 Django urls.py 代码有什么问题吗?
- reactjs - 多个 React 渲染组件:如何共享状态?
- webpack - 在 webpack 5 中是否有其他方法可以转换加载器以使 pdfkit 正常工作?
- typescript - 打字稿:每个键的映射对象值类型
- python - 互联网不可靠的 aiohttp 速率限制请求
- azure - Azure 自定义策略为处于冲突状态的 sql db 打开混合许可证
- c - 为什么用 void 关键字调用函数没有效果?
- reactjs - Typescript 验证从传递给通用 React 组件的回调返回的对象的属性?
- python - 在 Pandas 数据框中添加带有类别的新列