如何从泛型、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 已使用实现 Localized
的 T
类型参数化的事实,但是,这不会造成伤害很多,即使可以,生成的代码也会包含在字节代码级别上转换的相同类型。
绕过它的唯一方法是让构造函数的调用者提供函数(添加一个 Function<T, Locale>
参数)。但取决于不同呼叫者的数量,这不一定是一种简化。
我有一个 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 已使用实现 Localized
的 T
类型参数化的事实,但是,这不会造成伤害很多,即使可以,生成的代码也会包含在字节代码级别上转换的相同类型。
绕过它的唯一方法是让构造函数的调用者提供函数(添加一个 Function<T, Locale>
参数)。但取决于不同呼叫者的数量,这不一定是一种简化。