如何从泛型、clazz 和接口中获得 Java 8 Lambda?

How can I get a Java 8 Lambda from a generic, a clazz and an interface?

我有一个 class 接受通用

public class Publisher<T extends Storable> {
    ...
} 

扩展 Storable 的 classes 的对象可以是 "published"(由此 class 处理)。

在构造函数中,我还获得了有关此实例 if Publisher 必须处理的特定 class 的信息

public Publisher(Class<T> clazz) {
    ...
}

在这个构造函数中,我检查 class 是否也实现了 "Localized"。如果是这样,我想将 lambda 存储到 Localized 接口中定义的方法(在此示例中 "getLocale()")我想要 lambda 的原因是出于向后兼容性的原因,让我们不要关注该设计决策。

public class Publisher<T extends Storable> {

    private Function<T, Locale> localeGetter;

    public Publisher(Class<T> clazz) {
        if (Localized.class.isAssignableFrom(clazz)) {
            this.localeGetter = ???????;
        }
    }
}

我认为应该有所有信息以便设置我的 lambda,但我不知道如何对其进行编码。可能吗?

此致, 安德烈亚斯

回想一下您将如何使用普通代码执行操作,然后将该代码放入 lambda 表达式中:

if (Localized.class.isAssignableFrom(clazz)) {
    this.localeGetter = t -> ((Localized)t).getLocale();
}

由于类型擦除,您无法利用 class 已使用实现 LocalizedT 类型参数化的事实,但是,这不会造成伤害很多,即使可以,生成的代码也会包含在字节代码级别上转换的相同类型。

绕过它的唯一方法是让构造函数的调用者提供函数(添加一个 Function<T, Locale> 参数)。但取决于不同呼叫者的数量,这不一定是一种简化。