我以爲我理解泛型很好,但顯然我沒有。馴服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