我得到了以下物品:
public class DbRepository<T> implements DbRepositoryInterface<T>{
protected T model;
protected DbRepository(T model) {
System.out.println("DbRepository created.");
this.model = model;
}
@Override
public T getModel() {
return model;
}
}
public interface DbRepositoryInterface<T> {
public T getModel();
}
public class PlayerDbRepository extends DbRepository<Player> {
}
在我的代码中,我想要使用我想要调用的PlayerDbRepository
:
DbRepositoryInterface<Player> repo = new PlayerDbRepository();
但在PlayerDbRepository
中,我收到有关父类DbRepository
中的构造函数的警告。我需要修改什么来使其工作?或者我的方法是错误的吗?
答案 0 :(得分:0)
DbRepository
类有一个需要T
的构造函数。由于您的PlayerDbRepository
子类为DbRepository
,因此您必须使用T
实例调用父构造函数。
你可以这两种方式:
在子类中创建一个类似的构造函数,它接受一个Player并将其委托给父构造函数:
public class PlayerDbRepository extends DbRepository<Player> {
public PlayerDbRepository(Player model){
super(model);
}
}
以其他方式创建一个Player实例并在
中传递它public class PlayerDbRepository extends DbRepository<Player> {
public PlayerDbRepository(){
super(new Player());
}
}
当然,您始终可以将两种解决方案结合使用,以便代码的用户可以选择最适合他们的选项。
public class PlayerDbRepository extends DbRepository<Player> {
/**
* Creates new Repository with default Player.
*/
public PlayerDbRepository(){
super(new Player());
}
/**
* Creates new Repository with given Player.
*/
public PlayerDbRepository(Player model){
super(model);
}
}
答案 1 :(得分:-1)
DbRepositoryInterface是界面。
您无法创建界面对象。
您可以做的一件事是实现Factory类,将您的接口映射到您的存储库类。通常我们使用工具来做到这一点。
您的实例化将如下所示: DbRepositoryInterface repo = FactoryClass.GetInstanceOf(); 反过来,无论如何,你将返回PlayerDbRepository对象。
谢谢,