我正在嘗試使用有界型別和泛型來創建子類的泛型物件(這些實作了一個介面)。但是在使用子類初始化物件時出現型別不匹配錯誤。
這是界面:
public interface ScannableEntity {
}
下面是實作這個介面的類:
public final class Attachment implements ScannableEntity {
.
.
.
}
現在我創建了 2 個類(SegmentPageScanResult和ItemProcessor),其有界泛型型別為:
@Builder
public class SegmentPageScanResult<TEntity extends ScannableEntity> {
.
.
.
}
和
public class ItemProcessor<TEntity extends ScannableEntity> {
void submitAndExecute(SegmentPageScanResult<TEntity> pageScanResult) {
. . .
}
}
當我嘗試初始化 SegmentPageScanResult 并嘗試submitAndExecute從單元測驗中呼叫 ItemProcessor 的方法時,如下所示:
@ExtendWith(MockitoExtension.class)
public class ScanTest {
@Mock
private ItemProcessor<Attachment> itemProcessor;
@Test
public void testDoScan() {
Attachment mockRecord = new Attachment();
SegmentPageScanResult<Attachment> segmentPageScanResult = SegmentPageScanResult.builder()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.scannedItems(ImmutableList.of(mockRecord))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.isLastPage(true)
^^^^^^^^^^^^^^^^^
.build();
^^^^^^^^^
verify(itemProcessor).submitAndExecute(segmentPageScanResult);
}
}
我得到錯誤 -
Required type: SegmentPageScanResult<Attachment>
Provided:SegmentPageScanResult<ScannableEntity>
有人可以幫我理解為什么我不能用實作介面的類來初始化通用物件嗎?
uj5u.com熱心網友回復:
我想你可能做過:
ItemProcessor<Attachment> itemProcessor = new ItemProcessor<>();
你還有:
SegmentPageScanResult<ScannableEntity> segmentPageScanResult = ...
所以當你打電話時:
itemProcessor.submitAndExecute(segmentPageScanResult, TEST_SEGMENT_ID, TEST_SCAN_ID);
itemProcessor (Attachment) 和 SegmentPageScanResult (ScannableEntity) 的型別不匹配。因此,您可能需要創建具有相同型別引數的 ItemProcessor 和 SegmentPageScanResult。
編輯:尚不完全清楚您要實作的目標,但也許這會有所幫助:
public class ItemProcessor<T extends ScannableEntity> {
private List<T> items;
void submitAndExecute(SegmentPageScanResult pageScanResult) {
pageScanResult.setScannedItems(items);
}
}
public class SegmentPageScanResult {
private final List<ScannableEntity> items = new ArrayList<>();
public void setScannedItems(List<? extends ScannableEntity> items) {
this.items.addAll(items);
}
}
所以 SegmentPageScanResult 不再有型別引數,因為它只處理 ScannableEntity 實體。為了允許從每個 ItemProcessor 設定不同的型別,方法引數允許子型別具有List<? extends ScannableEntity>
uj5u.com熱心網友回復:
基本上答案很簡單:在這里你指定了一個 ScannableEntity 型別的類。但是你使用了SegmentPageScanResult,你使用了ScannableEntity介面本身,我認為如果你使用實作介面類的Attachment類,而不是介面類,問題會得到解決,例如:你可以將它用作SegmentPageScanResult。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519889.html
上一篇:Kotlin創建一個通用函式,該函式接受任何實作介面的列舉
下一篇:如何從結構中獲取特定型別
