我为我的项目创建了一个简单的自制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
。
这有什么不对?
答案 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;
不会创建它的实例。