从父类获取子模型

时间:2014-10-06 19:47:41

标签: java activerecord reflection

我为我的项目创建了一个简单的自制ActiveRecord类。

我的getModel()课程中只有Player的问题,而ActiveRecord课正在扩展问题。

当我想使用getModel()课程中的ActiveRecord方法时,我无法使用它,因为它的类型不同。我不想在这里引用Player,因为我想使用多个模型。

任何人都有解决方案吗?

好的,所以我得到了一些东西:

abstract class ActiveRecord<T> {
   private T model;

   public T getModel() {
     return this.model;
   }
}

public class Player extends ActiveRecord<Player> {
}

public class Event extends ActiveRecord<Event> {
}

但是当我尝试在this.model课程中输出ActiveRecord时,它会返回null。 这有什么不对?

3 个答案:

答案 0 :(得分:1)

你的方法定义需要做这样的事情

public Class<? extends ActiveRecord> getModel();

这意味着返回类型是扩展ActiveRecord的类。当你对子进行此操作时,它将返回Player.class,因为Player扩展了ActiveRecord。

简要说明如果getModel返回该类的对象,那么您应该从方法函数中删除Class

public <? extends ActiveRecord> getModel();

答案 1 :(得分:0)

所以,如果我理解的话,你有一个名为ActiveRecord的超类和一个子类Player,它有一个方法getModel。

如果要将ActiveRecord用作引用类型,那么如果要访问该方法,则需要在该类中使用getModel方法。如果你永远不会实例化ActiveRecord,你可以将它抽象化并定义getModel方法摘要。如果你在ActiveRecord中没有任何实现逻辑,你也可以将它作为一个接口。

public abstract class ActiveRecord {
  public abstract Model getModel();
}

public class Player extends ActiveRecord {
  @Override
  public Model getModel() {
    ...
  }
}

答案 2 :(得分:0)

你让自己的生活变得艰难。 Java已经为你做了反思。

class Parent {
    // class content
}

class ChildA extends Parent {
    // class content
}

class ChildB extends Parent {
    // class content
}

Parent firstInstance = new ChildA();
Parent secondInstance = new ChildB();

Class typeOfFirst = firstInstance.getClass();
Class typeOfSecond = secondInstance.getClass();

对于null指针错误,在Java中(例如,与c ++不同),您必须使用new显式初始化每个变量。只有private T model;不会创建它的实例。