我必须为我的项目创建一个简单的自制ActiveRecord类。
只是遇到了一个问题,即我的Player
类中有一个getModel()
,它正在由ActiveRecord
类扩展。
当我想使用ActiveRecord
类中的getModel()
方法时,我无法使用它,因为它不是同一类型。我不想在这里引用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> {
}
但是当我尝试在ActiveRecord
类中输出this.model
时,它会返回null
。这里怎么了?
您的方法定义需要执行类似的操作
public Class<? extends ActiveRecord> getModel();
这意味着返回类型是扩展ActiveRecord的类。当您对子项执行此操作时,它将返回Player.class,因为Player扩展了ActiveRecord。
简要说明一下,如果getModel返回该类的对象,那么您应该从方法函数中删除class
public <? extends ActiveRecord> getModel();
所以,如果我理解得很好,你有一个名为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() {
...
}
}
你让自己的生活太艰难了。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;
并不能创建它的实例。