1 回答
TA貢獻1820條經驗 獲得超9個贊
編譯錯誤的原因是由于Object.getClass()方法。根據java文檔:
返回此對象的運行時類。返回的 Class 對象是由所表示的類的靜態同步方法鎖定的對象。
實際結果類型是 Class where |X|?是調用 getClass 的表達式的靜態類型的擦除。例如,此代碼片段中不需要強制轉換:
數字 n = 0;
類 c = n.getClass();
打電話時return Result.builder(resource.getClass()).build();
resource.getClass()Class<? extends Resource>將像Resource擦除一樣返回TResult.builder(resource.getClass())方法將返回Builder<? extends Resource>。Result.builder(resource.getClass()).build()會回來的Result<? extends Resource>。
的類型信息T在步驟 1 中丟失。因此,編譯錯誤顯示為返回類型不兼容。可以進行以下更改來解決該錯誤。
更改構建器方法以接受
T實例而不是Class<T>評論中的狀態。將調用者更改為傳遞
Class<T>而不是Class<? extends Resource>方法builder。
更改的代碼片段:
? // Caller
? // Solution 1
? public <T extends Resource> Result<T> createResult(T resource) {
? ? return Result.builder(resource).build();
? }
? // Solution 2
? public <T extends Resource> Result<T> createResult(Class<T> resourceClass) {
? ? return Result.builder(resourceClass).build();
? }
public class Result<T extends Resource> {
? ...
? //Solution 1
? public static <T2 extends Resource> Builder<T2> builder(T2 instance) {
? ? return new Builder<T2>();
? }
? // static factory method to get a builder
? // Solution 2
? public static <T2 extends Resource> Builder<T2> builder(Class<T2> clazz) {
? ? return new Builder<T2>();
? }
? ...
添加回答
舉報
