返回扩展抽象基类的具体类的类,而不是实例?

编程入门 行业动态 更新时间:2024-10-27 04:31:35
本文介绍了返回扩展抽象基类的具体类的类,而不是实例?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

如果我有这样的类层次结构

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,因为您正在返回扩展AbstractSuperClass的类。因此,您必须将其告知编译器并将返回类型更改为Class
  • 您不能直接从class调用any(无关紧要的静态方法或非静态方法) 。您需要使用反射API,所以您的方法调用将如下所示:

  • You can not return Class because you are returning a class that extends the AbstractSuperClass. So you have to inform the compiler about it and change the return type to Class
  • 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); } } }
  • 更多推荐

    返回扩展抽象基类的具体类的类,而不是实例?

    本文发布于:2023-11-12 09:47:15,感谢您对本站的认可!
    本文链接:https://www.elefans.com/category/jswz/34/1581159.html
    版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
    本文标签:抽象   而不是   实例

    发布评论

    评论列表 (有 0 条评论)
    草根站长

    >www.elefans.com

    编程频道|电子爱好者 - 技术资讯及电子产品介绍!