我正在尝试使用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
}
}
也就是说,我不明白为什么要首先使用泛型,如果普通的旧多态性可以很好地完成工作。