我如何使用Java泛型写这个方法?



我正在尝试使用java泛型编写此方法:

public void trackUserActivity(String operation,TemplateEntity templateEntity,String user,,String entity, HistoryJpaRepository  historyJpaRepository)
{
HistoryEntity historyEntity = new HistoryEntity();
historyEntity.setData(new java.sql.Date(Calendar.getInstance().getTimeInMillis()));
historyEntity.setAction(operation);
historyEntity.setEntity("TEMPLATE");
historyEntity.setEntityJson(null);
if(!operation.contentEquals("CREATE"))
{
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();

String json = null;
try {
json = ow.writeValueAsString(templateEntity);
} catch (JsonProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
historyEntity.setEntityJson(json.getBytes());  


} 
historyEntity.setIdEntity(templateEntity.getId());
historyEntity.setUser(user);       
historyJpaRepository.save(historyEntity);

}

在这个方法中,我有getId()方法,这是多种对象类型的通用方法,我试图创建一个接口,默认方法具有泛型类型T,扩展多个类:

public interface HistoryUtils <T extends LavorazioneDto,DizionarioDto,CampoDizionarioDto,FontDto,RegolaCampoDizionarioDto,TemplateEntity >{





public default void trackUserActivity(String operation,T t,String user,String entity, HistoryJpaRepository  historyJpaRepository)
{
HistoryEntity historyEntity = new HistoryEntity();
historyEntity.setData(new java.sql.Date(Calendar.getInstance().getTimeInMillis()));
historyEntity.setAction(operation);
historyEntity.setEntity(entity);
historyEntity.setEntityJson(null);
if(!operation.contentEquals("CREATE"))
{
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = null;
try {
json = ow.writeValueAsString(t);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
historyEntity.setEntityJson(json.toString().getBytes());

}
historyEntity.setIdEntity(t.getId());
historyEntity.setUser(user);       
historyJpaRepository.save(historyEntity);

}

只有当我在其中一个服务中自动连接我的接口并尝试调用interface方法时,我得到这个错误:类型HistoryUtils中的方法trackUserActivity(String, LavorazioneDto, String, String, HistoryJpaRepository)不适用于参数(String, TemplateEntity, String, String, HistoryJpaRepository)。如何编写一个使用泛型并扩展所需的所有类的接口?

声明

<T extends LavorazioneDto,DizionarioDto,CampoDizionarioDto,FontDto,RegolaCampoDizionarioDto,TemplateEntity >

要求T扩展LavorazioneDto扩展DizionarioDto,以此类推。也就是说,它需要T扩展所有这些类型,而不是其中任何一个类型。在类型理论中,T是一个交型,而不是并型。Java在类型边界中不支持联合类型

通常的解决方案是让可能的子类型实现一个公共接口,并使用该接口作为参数类型:
interface Identifiable {
String getId();
}
class LavorazioneDto implements Identifiable {
public String getId() {
return id;
}
}
interface HistoryUtils {
public default void trackUserActivity(String operation,Identifiable t,String user,String entity, HistoryJpaRepository  historyJpaRepository) {
t.getId(); // works just fine
}
}

也就是说,我不明白为什么要首先使用泛型,如果普通的旧多态性可以很好地完成工作。

最新更新