2010-03-02 64 views
4

我想通過繼承其他普通類(綁定)創建一個新的類,並實現通用接口(不綁定):是否有可能同時和一般地將有界泛型類和泛型接口子類化?

public class Foo1<T extends Bar> { 
    ... 
} 

public interface Foo2<T> { 
    ... 
} 

public class ProblemClass<T extends Bar, U> 
     extends Foo1<T extends Bar> implements Foo2<U> { 
    ... 
} 

這給了我編譯錯誤。我也嘗試過:

public class ProblemClass<T, U> 
     extends Foo1<T extends Bar> implements Foo2<U> { 
    ... 
} 

public class ProblemClass<T extends Bar, U> 
     extends Foo1<T> implements Foo2<U> { 
    ... 
} 

但是這些都沒有工作。

什麼是正確的語法來定義我的子類的方式,讓我保持鍵入泛型,讓我把他們的類型傳遞給超類和接口?這甚至有可能嗎?

謝謝!

+0

編譯器錯誤? – 2010-03-02 00:28:52

+2

我對這個用例感興趣。 – 2010-03-02 00:32:05

+1

你的意思是'ProblemClass'對於'T'都具有相同的類型嗎?如果你在'Foo1'和'Foo2'中有「匹配」方法,這將是必要的。 – 2010-03-02 00:39:58

回答

2

該聲明應該正常工作。你會得到什麼錯誤?你使用什麼編譯器?

class ProblemClass<T extends Bar, U> 
    extends Foo1<T> 
    implements Foo2<U> 
{ 
    ... 
} 

這是有效的Java。如果IDEA的編譯器拒絕它,IntelliJ有一個錯誤。

+0

我正在使用IntelliJ IDEA 9,在這種情況下的錯誤是: 類型參數'T'不在其範圍內;應該實施第 – Pinkerton 2010-03-02 01:09:39

+0

號+1對於第一個想法錯誤提示 – 2010-03-02 07:20:07

1

從您發佈的代碼中,您只有Foo類而不是Foo1類。這是原因嗎?或只是發佈編輯錯誤?

我認爲這應該工作

public class ProblemClass<T extends Bar, U> 
     extends Foo1<T> implements Foo2<U> { 
    ... 
} 
+0

對不起,我在編輯格式化問題時必須意外地將'Foo1'改爲'Foo'。原來的問題包含'Foo1'。 – 2010-03-02 00:35:20

+0

我剛剛測試過它,它爲我編譯。@Pinkerton,如果這不能爲你編譯,請發佈錯誤消息。 – 2010-03-02 00:40:05

+0

@Joe我看到的錯誤(在IntelliJ IDEA 9中)是: 類型參數'T'不在其範圍內;應該執行「Bar」 – Pinkerton 2010-03-02 01:13:21

1

這沒有給出編譯錯誤與JDK 1.6.0_07

public class Bar {} 

public class Foo1<T extends Bar> {} 

public interface Foo2<T> {} 

public class ProblemClass<T extends Bar, U> extends Foo1<T> implements Foo2<U> {} 
+0

由於某種原因,IntelliJ IDEA 9抱怨: 類型參數'T'不在其範圍內;應該實現'Bar' – Pinkerton 2010-03-02 01:10:37

0

這(從你的問題):

public class ProblemClass<T extends Bar, U> 
     extends Foo1<T extends Bar> implements Foo2<U> { 
    ... 
} 

應該是這樣的:

public class ProblemClass<T extends Bar, U> 
     extends Foo1<T> implements Foo2<U> { 
    ... 
} 

也就是說,在擴展Foo1時,不應該重申邊界。

通過該校正,代碼在javac中編譯得很好。如果IntelliJ IDEA仍然拒絕編譯它,那麼你可能發現了一個錯誤,或者你在Foo.java中提到的「Bar」與ProblemClass.java中的「Bar」不是同一個「Bar」?

+0

是的,我想我可能在IDEA中發現了一個bug。我嘗試過的簡化案例在您提出的語法中工作得很好。 – Pinkerton 2010-03-02 01:28:13