【问题标题】:java, generic and getAlljava、泛型和getAll
【发布时间】:2014-02-21 10:27:02
【问题描述】:

我正在尝试使用泛型修改我的代码以避免所有重复代码。

我有一个类 DBBaseClass,它将被其他类扩展。我正在尝试创建一个 getAll 方法,该方法返回存储在数据库中的子类的所有对象。

 class abstract DBBaseClass {

  abstract readDataBase(int _id);

  public  <T extends DBBaseClass> List<T> getAll()
  {

 List<T> array = new ArrayList<T>();    

 ArrayList<Integer> myints = DBManager.request_database_for_ids(getIdField(), getTableName());

 T myTObject = new T();    // NOT WORKING  *************************

 for (int i=0;i<myints.size();i++) {        
        myTObject.read(myints.get(i));
        array.add(myTObject);
    }               

return array;

我有错误: - 无法实例化类型 T - 类型 T 不是通用的;它不能被参数化 论据

如何在这里实例化我的 T 子类?

有什么诀窍??

谢谢。

编辑:

更详细地解释我的目标: 我有两个扩展 DBBaseClass 的类 SUbClassA 和 SubClassB。

我想要一个方法: SubClassA.getAll() 返回 SUBClassA 对象的数组列表。 SubClassB.getAll() 返回一个 SUbClassB 对象的数组列表。

起初,我在我的所有子类中创建了 getAll...所以,我现在尝试将此 getAll() 放入 DBBaseclass。

如果我希望他们返回 List,这很容易做到,但我不知道如何告诉方法“向我返回这种特定类型子类的列表”。

【问题讨论】:

  • 您希望 DBBase 类包含自身的实例吗?这对我来说看起来很奇怪。请解释一下,就像我们是 9 岁的孩子一样,您想要实现什么。

标签: java generics


【解决方案1】:

你想让 DBBaseClass 通用,这样声明它:

abstract class DBBaseClass<T extends DBBaseClass<?>>

【讨论】:

【解决方案2】:

您只能实例化一个具体类,但不能实例化 T,因为它只是一个类型,而不是 DBBaseClass,因为它是抽象的。

你能做什么:

  • 定义一个扩展DBBaseClass的具体类,例如SubDBBaseClass
  • 为每个返回具体实例的子类创建一个工厂方法,例如

    protected T create() {
        return new SubDBBaseClass();
    }
    
  • 在您的DBBaseClass.getAll() 方法中调用此方法,例如

    T myTObject = create();
    

也许您不知道,但您使用的active record pattern 有起有落。我不喜欢这种模式,我会重新设计架构。但这些只是我的 5 美分。

【讨论】:

  • 感谢它的工作。实际上,我最初是在重新设计架构,当我开始我的项目时,我的 OOP 知识非常差。所以,我很高兴能获得一些关于如何重新设计架构的线索。我听说过工厂模式。不确定它是否可以在这里工作。
  • 看看 Martin Fowler 的优秀著作《企业应用程序架构的模式》,它概述了服务架构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多