我以为我很了解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) {}
}
Run Code Online (Sandbox Code Playgroud)
编译器不允许上面的test1方法,说"Job"不在其类型范围内.我有点理解它 - Job因为原始类型不会延伸Job<Job,Run>,因此错误.相比之下,test3有效.
现在,问题是,我该如何做这项工作?我已经尝试过#2,但这也不起作用.我认为问题与#1非常相似--- Job<Job,Run>不在范围内,因为它的类型参数Job是原始类型.
除了采用原始类型之外,有谁知道如何让类型检查器开心?或者只是在Java类型系统中无法实现?
小智 1
或许:
public <J extends Job<J, R>, R extends Run<J, R>> void test(RunList<J, R> why) {}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
394 次 |
| 最近记录: |