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
擦除一樣返回T
Result.builder(resource.getClass())
方法將返回Builder<? extends Resource>
。Result.builder(resource.getClass()).build()
會回來的Result<? extends Resource>
。
的類型信息T
在步驟 1 中丟失。因此,編譯錯誤顯示為返回類型不兼容??梢赃M行以下更改來解決該錯誤。
更改構建器方法以接受
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>();
? }
? ...
添加回答
舉報