2014-06-14 67 views
0

請研究下面的代碼片段:如何理解在泛型方法中選擇哪種類型而不是T?

class Ideone { 
    public static void main (String[] args) throws java.lang.Exception { 
     List<Integer> listIntegers = null; 
     List<Object> listObjects = null; 
     MyClass mcls =new MyClass(); 

     SomeReference ref = mcls.method(listIntegers,listObjects));//which SomeReference may be? 
    } 
} 

class MyClass { 
    <T> T method(List<? extends T> arg1, List<? super T> arg2) { 
     return null; 
    } 
} 

我可以在法名method除了null的return語句寫什麼;

對象? 數量? 整數?

+0

你想要返回什麼?你的預期產出是多少? – Braj

+0

@Braj我很困惑我可以返回什麼。我想知道所有可能的變體 – gstackoverflow

+0

如果不知道你想要做什麼,那麼首先考慮它並再次詢問。即使你不知道這種方法在這裏做了什麼,那麼你怎麼能期待我們去思考它。 **從不**問任何這樣愚蠢的問題,甚至對你本身來說都不清楚。 – Braj

回答

2

它可能會幫助你理解它。由於您不能從第二個列表返回任何項目,因此只有一個選項可以從第一個列表中返回項目。

class MyClass { 
    <T> T method(List<? extends T> list1, List<? super T> list2) { 
     return list1.get(0); // Valid 
     //return list2.get(0); // Invalid Type mismatch: cannot convert from capture#1-of ? super T to T 
    } 
} 

List<Integer> listIntegers = new ArrayList<Integer>(); 
listIntegers.add(1); 

List<String> listObjects = new ArrayList<String>(); 
listObjects.add("2"); 

MyClass mcls = new MyClass(); 

// Valid 
Integer result=mcls.method(listIntegers, listObjects); 

// Invalid 
String result=mcls.method(listIntegers, listObjects); 
// The method method(List<? extends T>, List<? super T>) in the type MyClass is not applicable for the arguments (List<Integer>, List<String>) 
+0

因此是T最具體的類型? – gstackoverflow

+0

如果你認爲你會在這個方法中傳遞兩種不同類型的列表,那麼使用雙通用參數'' – Braj

+0

它只是一個理論問題 – gstackoverflow

相關問題