java - 驯服 Java 泛型中的类型检查器

标签 java generics

我以为我很了解泛型,但显然我没有。

这里是问题的测试用例:

import java.util.ArrayList;

class Job<J extends Job<J,R>, R extends Run<J,R>> {}
class Run<J extends Job<J,R>, R extends Run<J,R>> {}

class Job2 extends Job<Job2,Run2> {}
class Run2 extends Run<Job2,Run2> {}

class RunList<J extends Job<J,R>, R extends Run<J,R>> extends ArrayList<R> {}

class Foo {
    // #1 problem
    public void test1(RunList<Job,Run> why) {}
    // #2 this doesn't work either
    public void test2(RunList<Job<Job,Run>,Run<Job,Run>> why) {}
    // #3 this works
    public void test3(RunList<Job2,Run2> why) {}
}

编译器不允许上面的 test1 方法,说“Job”不在其类型范围内。我有点理解 --- Job作为原始类型不扩展 Job<Job,Run> ,因此错误。相比之下,test3 有效。

现在的问题是,我该如何使它发挥作用?我试过 #2,但这也不起作用。我想这个问题与#1 --- Job<Job,Run> 非常相似。不在边界内,因为它的类型参数 Job是原始类型。

除了求助于原始类型,有谁知道如何让类型检查器开心?还是在 Java 类型系统中无法实现?

最佳答案

也许:

public <J extends Job<J, R>, R extends Run<J, R>> void test(RunList<J, R> why) {}

关于java - 驯服 Java 泛型中的类型检查器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3445353/

相关文章:

java - application.properties 中的 Kafka ErrorHandlingDeserializer2 配置值

java - spring 安全配置 xml 到 java

java - new View.OnClickListener(){} 类型中的 onClick(View, String) 方法永远不会在本地使用

java - Mac Mavericks Java 无法找到可执行文件 bash_profile 编辑不起作用

java - 如何将我的方法参数限制为仅用于 Set 和 List 类型的集合,而不是 Map?

java - 如何设置 Sublime text 3 在 linux 上运行和编译 java?

java - 给定通用函数之间的区别?

grails - 为什么这种通用用法在 groovy 中不起作用?

c# - 如何调用函数序列?

scala - 是否可以在 Scala 中指定对泛型类型 τ 的约束,使得 τ < : σ ∧ τ ≠ σ?