我以为我理解泛型很好,但显然我没有。驯服Java中的类型检查器泛型
这是问题的测试用例:
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,Run>
,因此错误。相反,test3起作用。
现在,问题是,我该如何做这项工作?我已经尝试了#2,但这也不起作用。我想这个问题与#1非常相似--- Job<Job,Run>
不在范围内,因为它的类型参数Job
是一个原始类型。
有没有人知道如何使类型检查开心,除了诉诸原始类型?或者它在Java类型系统中无法实现?
你能提供你想要什么工作的任何其他信息?看起来你有一个解决方案 - 哪一个是你想工作的,为什么? – mlschechter 2010-08-10 01:31:42
请注意,#3在语义上是不同的,它不是解决方案---它甚至不是解决方法。 #3有效地给你ArrayList,所以例如你不能在那里添加普通的运行对象。 我希望RunList具有简单的作业和运行,以便例如我可以将普通的运行对象放入其中。 #2,如果工作,会实现类似的东西。 –
2010-08-10 01:54:01