簡體   English   中英

傳入與方法簽名不匹配的值

[英]Passing in a value that does not match method signature

我正在使用 Apache Ignite,這並不是問題的核心,但提供了背景信息。 在這種情況下,我創建了一個擴展CacheStoreAdapter的類,該類具有一個具有以下簽名的方法:

@Override
public void write(Entry<? extends K, ? extends V> cacheEntry) throws CacheWriterException {

我用 Ignite 注冊了那個類,這樣每當我給它數據保存在它的緩存中時,它就會調用write()方法。

我驚訝地發現,根據 Ignite 的其他配置方式,以下代碼...

final V cacheObject = cacheEntry.getValue();
LOG.info("cacheObject = " + ToStringBuilder.reflectionToString(cacheObject));

...輸出以下內容:

 cacheObject = org.apache.ignite.internal.binary.BinaryObjectImpl@7c40ffef[ctx=org.apac

也就是說, cacheObject從拍攝Entry<? extends K, ? extends V> Entry<? extends K, ? extends V> Entry<? extends K, ? extends V>不是V類型的實例!

我已經解決了這個問題(正如我所說,它只發生取決於 Ignite 的其他配置方式),但我很好奇這在 Java 中是如何完成的。

TL;博士問題:

如何將變量傳遞給不符合方法簽名的方法? 某種反射技術? 這樣做有常見/合法的用途嗎?

在 java 中,類型參數是可選的:它們不與對象實例一起攜帶,只存在於語言級別。

因此,您始終可以將任何內容強制轉換為,然后調用已刪除類型檢查的任何方法:

Map<String, Integer> sim = new HashMap<>();
Map<Object, Object> oom = (Map<Object, Object>) (Map) sim;

至於 BinaryObjectImpl,Ignite 會盡量將對象保持在序列化狀態,以節省序列化成本。 所以你應該知道 CacheStore 的類型參數並不總是面向用戶的類型。

您的write實現的調用者可能會創建一個原始類型Map.Entry的實例。 例如:

Entry entry = new Entry() { /* ... */ }
...
cache.write(entry);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM