我有以下課程:
@Data
public class PagedSchoolDto {
private final Integer count;
private final Map<String, List<School>> content;
private final String pagingState;
private final Boolean hasNext;
public PagedSchoolDto(final Slice<School> slice) {
this.content = slice.getContent().stream().collect(
Collectors.groupingBy(School::getId, () -> new TreeMap<>(new UUIDComparator()), Collectors.toList()));
this.count = slice.getContent().size();
this.hasNext = slice.hasNext();
this.pagingState = getPagingState(slice);
}
@Nullable
private static String getPagingState(final Slice<School> slice) {
if (slice.hasNext()) {
CassandraPageRequest pageRequest = (CassandraPageRequest) slice.nextPageable();
return pageRequest.getPagingState().toString();
} else {
return null;
}
}
}
現在,我想讓我的代碼通用,以便我可以將這個類用于其他物件型別,如下所示:
@Data
public class PagedDto<T> {
private final Integer count;
private final Map<String, List<T>> content;
private final String pagingState;
private final Boolean hasNext;
public PagedDto(final Slice<T> slice) {
this.content = slice.getContent().stream().collect(
Collectors.groupingBy(<T>::getId, () -> new TreeMap<>(new UUIDComparator()), Collectors.toList()));
this.count = slice.getContent().size();
this.hasNext = slice.hasNext();
this.pagingState = getPagingState(slice);
}
@Nullable
private static <T> String getPagingState(final Slice<T> slice) {
if (slice.hasNext()) {
CassandraPageRequest pageRequest = (CassandraPageRequest) slice.nextPageable();
return pageRequest.getPagingState().toString();
} else {
return null;
}
}
}
我所有的類都有一個名為 ID 的屬性,它是 UUID 型別,因此比較器應該可以正常作業所有泛型型別。問題是我不確定如何撰寫 Collectors.groupingBy 的函式和供應商代碼,因為第二個片段給出了編譯錯誤。
uj5u.com熱心網友回復:
您的泛型型別 T 未指定,例如不提供 getId 方法的“Object”。為了在通用代碼中訪問 getId,T 必須使用 getId 方法擴展一個介面,該方法由與 PagedDto 一起使用的任何類實作:
public interface WithId {
UUID getId();
}
public class School implements WithId {
private UUID id;
@Override
public UUID getId() {
return id;
}
public class PagedDto<T extends WithId> {
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/311202.html
上一篇:在trait中參考泛型的生命周期
