作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我以为我很了解泛型,但显然我没有。
这里是问题的测试用例:
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/
我是一名优秀的程序员,十分优秀!