我有一个Scala + Java项目。
在java类中,我需要从同一个类扩展的2个类,它们的用法在scala中定义。
所以我有这个课
public class BaseUser {
int id;
private String name;
public BaseUser withName(String name){
this.name = name;
return this;
}
}
和扩展类
public SpecificUser extends BaseUser {
//inherit default for now
}
然后在scala中我有一个DAO的定义
trait BaseUserDao {
def insertUser(user:BaseUser) : Boolean
}
class SpecificUserDao extends UserDao{
def insertUser(user : SpecificUser) : Boolean = {
db.insert(user).isDefined
}
}
但这不编译,它说我必须实现insertUser(用户:BaseUser)而不是SpecificUser
如何定义它以便我可以为每个用户类型创建一个实现?
答案 0 :(得分:2)
将您的实施更改为如下所示的内容。有一个类型参数T
,其上限为BaseUser
。在SpecificUserDao
的声明中,只需制作T
SpecificUser
。
trait BaseUserDao[T <: BaseUser] {
def insertUser(user: T) : Boolean
}
class SpecificUserDao[SpecificUser] extends BaseUserDao[SpecificUser] {
override def insertUser(user: SpecificUser): Boolean = ???
}
或者您可以在特征中声明类型T
。
trait BaseUserDao {
type T <: BaseUser
def insertUser(user: T) : Boolean
}
class SpecificUserDao extends BaseUserDao {
override type T = SpecificUser
override def insertUser(user: SpecificUser): Boolean = ???
}
答案 1 :(得分:-3)
你的构造函数应该这样写:
public class BaseUser {
protected int id;
protected String name;
public BaseUser(String name){
this.name = name;
}
}