2017-09-23 78 views
2

我的应用程序中有几个实体,我想要一个功能,当用户试图保存它们时,我可以一般地为它们设置一些属性。java中的通用函数名称8

对于这一点,我试图写一个实用工具类,如下所示:

public class IrisUserUtil<T> { 

IrisUserRepository irisUserRepository; 

public IrisUserUtil(IrisUserRepository irisUserRepository){ 
    this.irisUserRepository = irisUserRepository; 
} 

public <S extends T> S populate(S entity) { 

    //IrisUser irisuser = irisUserRepository.findOne(entity.getIrisUserId()); 
    //entity.setFirstName(irisuser.getFirstName()); 
    //entity.setLastName(irisuser.getLastName()); 
    return entity; 

} 
} 

此,我将只是我的repository.save()之前调用;在这里,我正在寻找正确的方式来调用功能,如entity.getIrisUserId()等传递参数是“实体”。当然,这是行不通的。

请提示为什么?

+0

对'S'和'T'有什么约束,上面的代码是否编译? – nullpointer

+0

是,编辑的问题与参数@Assafs,这样 公共类IrisUserUtil {... 它compliles –

回答

1

也许与<S extends Entity>而不是T这里T是什么? 编译器如何知道S是扩展实体类(或其他基类)的东西?

public <S extends T> S populate(S entity) 

在你的代码S和T是扩展对象出头,在compilater无法知道你的方法getIrisUserId()的getFirstName()等等......

我认为你必须删除您的通用ŧ在课堂上,只是做

public <S extends Entity> S populate(S entity) 

或(但是没用,更复杂)

public class IrisUserUtil<T extends Entity> { 

public <S extends T> S populate(S entity) 

或以简单的方式无需使用泛型类型只是做(但你有具体的类型转换返回的实体),在我的例子实体

public Entity populate(Entity entity) { 

... 
return entity; 

} 

是你的实体抽象基类

+0

T是泛型类型,像这样:公共类IrisUserUtil

+0

我知道仿制药,但这一职位前,因为编辑类定义是公共类IrisUserUtil {没有T –

+0

您是否建议,我应该创建一个名为“实体”的类,并具有getName,setName等抽象方法,并让其他扩展它,所以当它们的实例传递给此方法时,它可以工作! 我不赞成创建一个抽象类,有没有什么办法可以基于字符串评估方法引用,并将其命名为 –