传入与方法签名不匹配的值

Passing in a value that does not match method signature

我正在使用 Apache Ignite,这并不是问题的核心,但提供了背景知识。在这种情况下,我创建了一个 class 扩展 CacheStoreAdapter,它有一个具有以下签名的方法:

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

我在 Ignite 上注册了 class,所以每当我给它数据保存在它的缓存中时它都会调用 write() 方法。

我惊讶地发现,根据 Ignite 的其他配置方式,以下代码...

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

...输出以下内容:

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

也就是说,取自 Entry<? extends K, ? extends V>cacheObject 不是类型 V!

的实例

我已经解决了这个问题(正如我所说,它只发生取决于 Ignite 的其他配置方式),但我很好奇 Java.

中这是如何完成的

TL;DR 问题:

如何将变量传递给不符合方法签名的方法?某种反射技术?这样做有常见的/合法的用途吗?

在java中,类型参数是可选的:它们不随对象实例一起携带,仅存在于语言级别。

因此,您始终可以将任何内容强制转换为然后调用任何已删除类型检查的方法:

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

至于 BinaryObjectImpl,Ignite 会尽量将对象保持在序列化状态,以节省序列化成本。所以你应该知道 CacheStore 的类型参数并不总是 user-facing 类型。

您的 write 实现的调用者可能会创建 raw type Map.Entry 的实例。例如:

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