2012-12-04 193 views
0

我有兩個類使用泛型類型(A,B)。 我的問題是 - 從B裏面使用第一個泛型類型(TA)的最佳方法是什麼? 下面是簡單的例子:Java - 適應「嵌套」泛型類型

public class A<TListItemsType> 
{ 
    List<TListItemsType> list = new LinkedList<TListItemsType>(); 
    public List<TListItemsType> getList() 
    { 
     return list; 
    } 
} 
public class B<TContainderType extends A> 
{ 
    TContainderType temp = null; 
    public B(TContainderType cont) 
    { 
     temp=cont; 
    } 
    public void DoWork() 
    { 
     for (TListItemsType item : temp.getList()) 
     { 
      System.out.println(item); 
     } 
    } 
} 

我試着解決方案建議here -

public class B<TContainderType extends A<TListItemsType>> 
{ 
    TContainderType temp = null; 
    public B(TContainderType cont) 
    { 
     temp=cont; 
    } 
    public void DoWork() 
    { 
     for (TListItemsType item : temp.getList()) 
     { 
      System.out.println(item); 
     } 
    } 
} 

而且只要它的工作原理是使用前定義的類型,如整數或字符串,可悲的是,這並未」由於編譯器無法將泛型識別爲類名,因此不起作用。

因此進一步繼續,並試圖配置另一個泛型類型,然後使用它裏面的延伸:

public class B<TListItemsType, TContainderType extends A<TListItemsType>> 
{ 
    TContainderType temp = null; 
    public B(TContainderType cont) 
    { 
     temp=cont; 
    } 
    public void DoWork() 
    { 
     for (TListItemsType item : temp.getList()) 
     { 
      System.out.println(item); 
     } 
    } 
} 

而且它確實可以工作,但它沒有氣味的權利。是否有另一種方法使用另一種泛型類型使用的泛型類型?

+1

對不起,但它是非常煩人的,你的實際類名稱是單個字符名稱和您的類型參數很長。它應該是另一種方式,它使代碼難以置信地難以閱讀。 – biziclop

+0

@biziclop,我認爲很明顯,在這種情況下,重要的部分是泛型而不是類名,這是一個非常簡單的例子,給泛型賦予單個字符名稱會使代碼完全不可讀。我可以向你保證,在RL中這些類有全名:) – SimSimY

+0

正好相反:這使得代碼無法讀取。泛型的單個字符名稱很好,這是每個人都習慣的。 – biziclop

回答

1

你沒有使用B<TListItemsType, TContainderType extends A<TListItemsType>>對我來說很好的方式......

的原因,這是有道理的,你B類現在確實需要兩個參數來描述它:TListItemsTypeTContainderType。實際上,您甚至在BDoWork()函數中明確使用了TListItemsType。所以你需要將它作爲參數傳遞纔是公平的。否則,編譯器甚至不知道你的意思,你DoWork()函數裏,你也可以同樣寫的類定義是這樣的:

public class B<TWorkItemType, TContainderType extends A<TWorkItemType>> 
{ 
    //... 

    public void DoWork() 
    { 
     for (TWorkItemType item : temp.getList()) 
     { 
      System.out.println(item); 
     } 
    } 
} 

(請注意,我重命名完全的類型,只是在B ,而不是在A!)

如果它只是需要你用相同的名字TListItemsType如在A定義中使用,你會相當的,你可以使用泛型做的事情有限。例如,您不能接受一種類型延伸List<E>,另一種延伸Enum<E>,因爲這兩種都使用<E>作爲它們的通用標識符。

我希望它更好,現在聞起來... :)

0

這是從你的問題真的不清楚你需要什麼要求,以及你需要使用TListItemsType什麼。如果你真的不需要以有意義的方式使用TListItemsType(因爲它看起來像你的榜樣),你可以消滅它,只是有TContainderType延長A<?>

public class B<TContainderType extends A<?>> 
{ 
    TContainderType temp = null; 
    public B(TContainderType cont) 
    { 
     temp=cont; 
    } 
    public void DoWork() 
    { 
     for (Object item : temp.getList()) 
     { 
      System.out.println(item); 
     } 
    } 
} 

,並對於這個問題,如果你是不打算返回TContainderType或類型參數或東西使用它,你甚至可以消除:

public class B 
{ 
    A<?> temp = null; 
    public B(A<?> cont) 
    { 
     temp=cont; 
    } 
    public void DoWork() 
    { 
     for (Object item : temp.getList()) 
     { 
      System.out.println(item); 
     } 
    } 
} 

因此,一切都取決於你需要做什麼。你的例子沒有太多的東西,所以它可以從中刪除很多東西,但這可能不是你實際需要的東西。

+0

很明顯,我不需要打印這些項目,因爲我的問題說 - 我需要使用該項目。 – SimSimY