java - 泛型混淆

标签 java generics

通用标题道歉,我真的想不出一种方法来解释这一点。

我想模拟一个场景,其中系统向用户提供设施,这些用户已将相关策略应用于针对这些设施的请求 .

public interface Facility {
    public List<Policy> getPolicies();
}
public interface Policy {
    public void apply(Facility facility, Request request);
}
public interface Request {

}

但是请求只能对特定类型的设施有意义,而政策实际上只能适用于一种设施类型和特定于该类型设施的请求类型。

public interface Facility<F extends Facility<F>> {
    public List<Policy<F, ? extends Request<F>>> getPolicies();
}
public interface Policy<F extends Facility<F>, R extends Request<F>> {
    public void apply(F facility, R request);
}
public interface Request<F extends Facility<F>> {

}

但我还希望能够全面指定策略,以便它们可以应用于任何设施父类(super class)型。

public interface Facility<F extends Facility<F>> {
    public List<Policy<? super F, ? extends Request<F>>> getPolicies();
}

但实际上,您只想查询适用于特定类型设施请求的政策。

public interface Facility<F extends Facility<F>> {
    public <R extends Request<F>> List<Policy<? super F, R>> getPolicies();
}

我现在的问题是,我对所有的泛型都感到很困惑,我什至无法创建一个适用于所有设施的策略类,如果它是合法的,这将是这样的

public class GeneralPolicy implements Policy<T extends Facility<T>, Request<T>>

根据上述描述,我如何才能以有意义的方式关联设施类型、政策和请求?我相信人们会要求澄清,我已经与这个斗争了足够长的时间,以至于我可能没有解释某些事情,或者完全遗漏了一个明显的观点。

最佳答案

如果我没看错的话,您真正想要做的是获取适用于 R 的所有策略。

public interface Facility<F extends Facility<F>> {
    public <R extends Request<F>> List<Policy<? super F, R>> getPolicies();
}

不幸的是,由于类型删除,你不能。在运行时,编译器不知道 R 是什么。

但是,您可以做的是通过类(class):

public interface Facility<F extends Facility<F>> {
    public <R extends Request<F>> List<Policy<? super F, R>> getPolicies(Class<R> requestClass);
}

然后 Policy 也需要返回它的请求类型:

public interface Policy<F extends Facility<F>, R extends Request<F>> {
    public void apply(F facility, R request);

    public Class<R> getRequestClass();
}

然后设施的实现可以遍历可用策略列表,检查策略的请求类型是否与实际请求的类型匹配,并返回该子集。

对于全局策略,策略可以返回 Request.class。对于特定的,MyRequest.class。

此外,我想说 Facility(至少您拥有它的方式)不需要泛型化,它会使代码简单得多。

关于java - 泛型混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6738777/

相关文章:

Java 日期时间差

java - 处理无效 REST API 参数的内部 Java 代码最佳实践

c# - 如何在C#中实现泛型(可能与C++和Java有关)?

swift - NSManagedObject.entity() - 未初始化

java - 我可以在像这样的 map 中使用通配符 Map<Class<?>, ?>

java - 将方法定义为它自己的类数据类型有什么用?

java - 泄漏抽象法则的异常(exception)

java - 在java中将对象传递给方法似乎是通过引用(而Java是通过val)

java - 为什么 operator < 有 Java 泛型的编译器错误?

c# - 为什么泛型 class<T> 中的 List<T>.RemoveAll 需要 Predicate 的变体形式?