2013-07-10 30 views
0

應該採用通用對象並返回另一個通用對象的方法的簽名是什麼,該通用對象要麼是原始類的相同要麼是子類?也就是說,如果方法採用某種泛型類A,則返回的對象保證爲AB,例如B extends A(直接或間接)?什麼方法簽名適用於返回通用對象?

下面的代碼體現了什麼,我試圖做的,在功能getList()

package com.company; 
import java.util.ArrayList; 

public class Main { 
    private Main(){ 
     List<String> stringList = new GenericMessageListCreator.getList(StringGenericMessage.class); 
    } 

    private class GenericMessageListCreator() { 
     public List<GenericMessage<T1>> getList(Class<T1 extends GenericMessage> clazz) { 
      return new ArrayList<T1>(); 
     } 
    } 

    private class GenericMessage<T> { 
     public GenericMessage(){}; 
     private T internalValue; 

     public void setValue(T value) { 
      this.internalValue = value; 
     } 

     public void echoValue() { 
      System.out.println("I contain " + internalValue); 
     } 
    } 

    private class StringMessage extends GenericMessage<String>{} 
    private class IntegerMessage extends GenericMessage<Integer>{} 
} 

例不談,實際上我在寫一個類的的註冊表,在命令用於Command小號模式。當我通過類獲取對象時,我想獲取合適的Command並將對象傳遞給它。

+0

什麼是返回一個'GenericMessage ',而不僅僅是一個'T'的地步? –

+0

在這個例子中沒有。問題最後解釋了我想使用它的真正原因。 A實際上想要返回處理T對象A的命令。然後我想將原始對象傳遞給該命令,並對結果進行處理。返回列表沒問題。此外,我只是選擇列表作爲已經具有通用簽名的便利。 – Wes

回答

2

我認爲你正在尋找此簽名:

public <T1 extends GenericMessage> List<GenericMessage<T1>> getList(Class<T1> clazz) { 
    return new ArrayList<T1>(); 
} 

,可以找到關於泛型方法here更多信息。

編輯

根據我從你的示例代碼明白,我會去這樣的事情(我糾正你的代碼中的一些語法錯誤):

private class GenericMessageListCreator { 
    public <U, V extends GenericMessage<U>> List<U> getList(Class<V> clazz){ 
     return new ArrayList<U>(); 
    } 
} 

private class GenericMessage<T> { 
    public GenericMessage(){}; 
    private T internalValue; 

    public void setValue(T value) 
    { 
     this.internalValue = value; 
    } 

    public void echoValue() { 
     System.out.println("I contain " + internalValue); 
    } 
} 

private class StringMessage extends GenericMessage<String>{} 
private class IntegerMessage extends GenericMessage<Integer>{} 

因此,你會能夠從`StringMessage創建List<String這樣的:

List<String> stringList = new GenericMessageListCreator().getList(StringMessage.class); 
+1

不需要'T1'的上限。 –

+0

我沒有得到正確的工作。我明白了兩個錯誤。 說「表達預期」我已經看過這個頁面,但不能根據這些信息得到它的工作。 – Wes

+0

我基於你的代碼的答案,但是當你的返回類型是List >?時,爲什麼你返回一個新的ArrayList ()? – ssssteffff

0

我什至不知道你要哪種方法對這個品行,但我假設它的getList()

private class GenericMessageListCreator() { 
    public <T extends GenericMessage<?>> List<T> getList(Class<T> clazz) { 
     return new ArrayList<T>(); 
    } 
} 
相關問題