gpt4 book ai didi

具有多个接口(interface)转换的 Java 通用对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:59:58 24 4
gpt4 key购买 nike

假设我有一个我使用的泛型类,它声明如下:

public class ConfigurableRuleKey<R extends Configurable & Rule> extends Key<R> {

private final R rule

public ConfigurableRuleKey(R rule) {
this.rule = rule;
}

/* Additional methods are declared here */

}

我想实现一个工厂方法来检查传递的规则是否实现接口(interface) Configurable,当创建可配置规则或只创建一个基本键时:

public static <R extends Rule> Key<R> create(R rule) {
if (rule instanceof Configurable) {
return new ConfigurableRuleKey<>(rule); //This will not compile
} else {
return new RuleKey<>(rule);
}
}

问题是,在我的工厂方法中,我无法将规则传递给 ConfigurableRuleKey 的构造函数,因为它不符合声明的通用约束(如果我明确检查它实现了 可配置)。问题是我如何转换我的规则实例,使其符合 ConfigurableRuleKey 中的构造函数限制?

最佳答案

我确实找到了一种无需使用原始类型即可执行您要求的方法,但它仍然涉及一对未经检查的强制转换:

@SuppressWarnings("unchecked")
public static <R extends Rule, T extends Rule & Configurable> Key<R> create(R rule) {
if (rule instanceof Configurable) {
return (Key<R>)new ConfigurableRuleKey<>((T)rule);
} else {
return new RuleKey<>(rule);
}
}

我不确定这是否比 sp00m 的答案更好,但至少是不同的。 :)

在 Java 的泛型中不能正确构造 this 的内在原因似乎是交集类型需要从具体接口(interface)构造,而不能从其他类型变量构造。因此,在这个例子中,没有办法构造 T,使其被 R 限制。没有这种能力,甚至没有办法拥有类似于 Class.asSubclass 的神奇方法来抽象此行为。

编辑:相关地,Java 8 似乎引入了匿名交集类型,您可以在其中转换为多个接口(interface)——例如。 (Configurable & Rule)rule——但即便如此也无济于事,因为出于与上述相同的原因,您无法转换为 (Configurable & R)。这将有助于摆脱类型变量 T,但是:

@SuppressWarnings("unchecked")
public static <R extends Rule> Key<R> create(R rule) {
if (rule instanceof Configurable) {
return (Key<R>)new ConfigurableRuleKey<>((Configurable & Rule)rule);
} else {
return new RuleKey<>(rule);
}
}

关于具有多个接口(interface)转换的 Java 通用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25639476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com