返回扩展抽象基类的具体类的类,而不是实例? [英] Return a class, not an instance, of a concrete class that extends an abstract base class?

查看:69
本文介绍了返回扩展抽象基类的具体类的类,而不是实例?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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.


  1. 您不能返回Class,因为您正在返回扩展AbstractSuperClass的类。因此,您必须将其告知编译器并将返回类型更改为Class

  2. 您不能直接从class调用any(无关紧要的静态方法或非静态方法) 。您需要使用反射API,所以您的方法调用将如下所示:

  1. 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
  2. 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);
      }
  }
}

这篇关于返回扩展抽象基类的具体类的类,而不是实例?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆