2017-03-16 59 views
0

考慮以下2實例功能:而第二個得到一個錯誤標記 Syntax error on token "(", Type expected after this tokenJava的使用?在泛型編程

我不明白爲什麼

public <T> void f1 (List<? extends Object> a) { 
    System.out.println(a); 
} 

public void f2 (<? extends Object> a) { 
    System.out.println(a); 
} 

第一個函數被接受。有人能幫我嗎?

編輯: 讓我改述一切。 我有一個類

package pk1; 
public class Gencla<T> { 
    public T alfa; 
} 

和測試類

package pk1; 
public class Test { 
    public void f1 (Gencla<? extends Object> a) { 
     System.out.println(a.alfa); 
    } 
    public void f2 (<? extends Object> a) { 
     System.out.println(a); 
    } 
    public static void main(String[] args) { 
    } 
} 

在這兩個函數f1和f2,什麼將要打印的東西,其類型爲「?擴展對象」。 爲什麼編譯器在f2上放置一個標記?

+1

您需要添加一個類型的通用。在第一種情況下,它是一個'List' – Jens

+0

[rtfm](https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html) – kajacx

+0

您需要在'public void f2( <?擴展對象> a){'。你錯過了,直接打開一個括號。在f2之後檢查(... –

回答

2

你F2功能:

public <T> void f2 (<? extends Object> a) { 
    System.out.println(a); 
} 

失敗確實定義了一個類型參數。通配符永遠不會用作泛型方法調用,泛型類實例創建或超類型的類型參數。 相反,它用於限制或擴展現有集合或泛型類型,因此可以使用更少或更多的類型。

public <T extends Object> void f2 (T a) { 
    //do stuff 
} 
+0

...但是' void f2(T a)'沒有優於直接的' void f2(Object a)'... – Holger

1

這是你想要做什麼?

public <T extends Object> f2 (T a) { 
} 
+0

這就是我想做的事情 接受任何擴展對象的函數 (有人會想要的東西爲什麼不能被接受? – quinzio