java - 方法在通用返回对象中不可用

标签 java

我试图从返回的对象 obj 访问方法 GetDatbaseName(),但它返回错误,表明该方法不可用。

但是,当我对 obj 进行类型转换时,它正在工作。

String name = ((Oracle)obj).GetDatabaseName();

如何处理这个泛型?就像我无法对 Oracle 和 MongoDB 等每种返回类型进行类型转换。还有更好的实现吗?

// 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)
  {
    Data dt = new Data("Oracle");
    Object obj = dt.GetObject();

    String name = obj.GetDatabaseName();

    System.out.println(name);
  }
}

public class Data
{
    public String _type;

    public Data(String type)
    {
      _type = type;
    }

    public Object GetObject()
    {
      Object obj = null;

      switch(_type)
      {
        case("Oracle"):

        obj = new Oracle("Test");

        break;

        case("MongoDB"):

        obj = new MongoDB("TestCollection");

        break;

      }

      return obj;
    }
}


public class Oracle
{
  public String _databaseName;

  public Oracle(String databaseName)
  {
    _databaseName = databaseName;
  }

  public String GetDatabaseName() { return _databaseName; }
}

public class MongoDB
{
  public String _collectionName;

  public MongoDB(String collectionName)
  {
    _collectionName = collectionName;
  }

  public String GetCollectionName() { return _collectionName; }
}

最佳答案

有两种方法可以解决这个问题,第一种是使用通用 class ,而第二个使用 interface ,如果您知道类将具有相同的方法,则第二种方法更好,而通用方法是类具有不同的方法

通用方法

public class DBtest{
    public static void main(String[] args){
        DataBase<Oracle> database = new DataBase<>(Oracle.class);

        Oracle oracle = database.getDataBase();

        System.out.println(oracle.getDatabaseName());
    }
}

class DataBase<T>{
    private T database;

    public DataBase(Class<T> classOfT){
        try {
            database = classOfT.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    public T getDataBase(){
        return database;
    }
}


class Oracle{
    private String _databaseName;

    public Oracle(){
        _databaseName = "test";
    }

    public String getDatabaseName() { return _databaseName; }
}

如您所见,无法定义数据库名称,您可以编写 <T extends Name>这是一个具有 getName() 的接口(interface)和setName()方法

界面方法

public class DBtest{
    // arguments are passed using the text field below this editor
    public static void main(String[] args){
        DataBase database = new DataBase(new Oracle("test"));

        DatabaseName databaseName = database.getDataBase();

        System.out.println(databaseName.getName());
    }
}

interface DatabaseName {
    String getName();
}

class DataBase{
    private DatabaseName databaseName;

    public DataBase(DatabaseName databaseName){
        this.databaseName = databaseName;
    }

    public DatabaseName getDataBase(){
        return databaseName;
    }
}


class Oracle implements DatabaseName {
    private String _databaseName;

    public Oracle(String name){
        _databaseName = name;
    }

    public String getName() {
        return _databaseName;
    }
}

class MongoDB implements DatabaseName {
    private String _databaseName;

    public MongoDB(String name){
        _databaseName = name;
    }

    public String getName() {
        return _databaseName;
    }
}

显然DatabaseName对于接口(interface)来说是一个坏名字,但它是两个类唯一相同的方法,因此这样调用它是有意义的。接口(interface)的伟大之处在于你不必关心什么 class只要您知道方法名称就可以使用。

关于java - 方法在通用返回对象中不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48567010/

相关文章:

java - Spring MVC : don't redirect after login - need two models?

java - 从 java 调用脚本,收到 sigpipe 信号

java - String.split() 后无法获取子字符串?

java - 如果它不是使用扫描仪的 int ,我怎样才能不允许用户输入?

java - XY block 渲染器 jfreechart 中 block 的轮廓

java - 如何根据项目属性的总和对集合进行分区,直到达到给定的限制?

java - 在 Swing/Spring 应用程序中 Autowiring 主类

java - 通话录音应用程序无法在 Android 操作系统版本 7.0 以上运行

java - 适当的 json 到后端 post 调用

java - JDBC 准备好的语句。 setDate(....) 不节省时间,只是日期.. 我怎样才能节省时间呢?