2010-03-05 53 views
4

我在看一些代碼,使這種形式:混淆Java泛型使用:我如何正確地參數化這個?

 

    1 package com.stackoverflow.java.questions; 

    2 import java.util.ArrayList; 
    3 import java.util.List; 

    4 public class B extends A<B> { 
    5  
    6  private 
    7  <C extends A> 
    8  List<C> getList(Class<C> cls) { 
    9   
    10   List<C> res = new ArrayList<C>(); 

       // "snip"... some stuff happening in here, using cls 

    11   return res; 
    12  } 

    13  public 
    14  List<A> getList() { 
    15   return getList(A.class); 
    16  } 

    17 } 

    18 abstract class A<C extends A<C>> { 

    19 } 

 

是的,我知道這是醜陋的,但我降低它,就像我可以管理。

我的問題是我如何正確地參數化第7,14和15行上的A的使用?

目前,我從Eclipse獲得第7行和第14行的警告(A是原始類型,對泛型類型A的引用應該參數化)。我懷疑當我修復其他行時,我會得到第15行的一個兩個,但我不確定。無論哪種方式,它目前沒有參數化,可能應該是,但我不知道語法應該是什麼。

有關如何添加適當的參數語義和語法以擺脫這些警告的任何想法?

注:我不確定A是否是遞歸泛型是否重要。如果我簡單地使用「抽象類A {}」來代替當前的定義,我仍然會得到相同的警告。

老實說,如果它是我自己的代碼,我會把它全部改成簡單得多。不幸的是,它是API的一部分,所以我試圖儘可能少地改變它。

謝謝!

UPDATE:

我能夠通過參數它們正如人們所期望解決的警告,但在錯誤的成本。歸根結底,我如何從一個抽象類中獲得類< A <B> >?

喜歡的東西,

類<甲<乙> > CLS =的A.class;

但是,這會導致類型不匹配錯誤。

UPDATE,第2部分:

事實證明,雅只是不能做它因類型擦除。見我的其他問題here.

+0

+1行號 – basszero 2010-03-08 14:07:09

回答

4

您可以通過在那些在前兩種情況下使用<C extends A<B>>List<A<B>>開始。在這種情況下,傳遞類型鍵會適得其反(參見cls參數從未如此使用),所以只需將其刪除即可。

(你總是可以說B.<Foo>getList()專門與特定類型實例化,假設你是開心的類型是當然的非具體化。)


更新納入OP的編輯:將使用A<?>爲你的代碼工作?在有限的情況下,您可能不需要完全指定類型。不幸的是,我沒有你的代碼,所以只有你可以找出它是否會起作用。

+0

這是一個很好的觀點,但是我沒有注意到類型鍵在實際代碼中使用的事實。當我添加示例時,我必須不小心將其剪掉。 我會先給其他東西一個鏡頭,然後回報。 – Tom 2010-03-05 02:31:50

+0

並因應您的更新 - 我第一次開始使用的第14行名單>,但後來我得到線15的類型不匹配(不能從類轉換爲類>。)其實都一樣,謝謝你的建議。 – Tom 2010-03-05 17:59:22

+0

@Tom:巨大的無賴。 :-(那麼,我們試圖:-) – 2010-03-05 18:19:21

0

你到底用CLS在這裏做的:

// "snip"... some stuff happening in here, using cls 

取決於你做什麼,在這裏,你可能有一個類型的實例代替類的實例,如果你告訴我一點關於你做了什麼在這裏,我可能會向您展示替代解決方案以使其工作。