2012-02-08 40 views
1

恐懼聽起來很愚蠢。 最近,我開始使用java/android。 我很喜歡它,但對於所有那些好的愛,我遇到了一個我似乎無法理解的操作符。 事情是,我甚至不知道它的名字,所以用它來搜索它幾乎是不可能的。我沒有發現任何關於它的事情,不是因爲它不在那裏,而是因爲我甚至不知道從哪裏開始。Java中的「<object>」運算符的含義

運營商是<someObject>。在List<object>中使用相同的運算符。 我居然在機器人使用的AsyncTask類時,我必須做這樣的事情在這個

MyClass extends AsyncTask<String[], Drawable[], Drawable[]>{ 
    ... 

任何信息,將不勝感激迷上了它。

+4

請在網上搜索「Java泛型」 – Mat 2012-02-08 10:24:03

+0

*泛型*和* parametized類型*應指向你良好的資源。完全理解,你需要* term *開始搜索:) – 2012-02-08 10:26:41

+0

感謝@Mat和andreas_D。這些都是偉大的起點 – frostymarvelous 2012-02-08 12:04:49

回答

7

它不是一個運算符 - 它是如何指定泛型類型參數。

這可能是最好從Generics part of the Java Tutorial開始,然後Gilad Bracha's paper,然後消耗Java Generics FAQ其他任何東西。 (有很多在Java泛型棘手的角落。)

+0

謝謝。從腳本背景來看,我必須說我很享受java。它有不同的(雖然令人耳目一新)功能,我花時間去理解。感謝您的耐心和幫助。讚賞。 – frostymarvelous 2012-02-08 12:12:55

0

如果我明白你的問題,然後List<Object> myList = new List<Object>意味着myList可以容納Objects或任何其子類。這意味着myList可以包含任何對象,因爲它們都是Object的所有子類。

0

在Java 1.5之前,Java的集合類是「無類型的」(技術上他們仍然是)。他們只能存儲從java.lang.Object派生的項目。這樣做有點麻煩,因爲你不得不將Object投射到你假定的包含類型。這導致各種各樣的問題和古怪。 Sun(現在的Oracle)爲語言添加了一個「技巧」,允許開發人員爲容器或其他對象指定「類型」。正如我所說的,這是一個「竅門」,編譯器執行類型安全檢查,但實際上對發射對象的簽名沒有改變。它清理了代碼並增加了一小部分類型安全,但實際上它只不過是一種客廳技巧。

查閱隨JDK提供的Generics文檔和可用教程。

2

這與通用類型和類型安全有關。

在「舊java」中,您只是有一個List,它包含Objects - 而不是類型安全的。

List l = new List(); 
l.add(new Type1()); // valid 
l.add(new SomeOtherType()); // valid 

這些天,你說

List<Type1> l = new List<Type1>(); 
l.add(new Type1()); // valid 
l.add(new SomeOtherType()); // invalid since it is a list of Type1 

在列表中的項目可以是類型1或任何它的子類。

3

它不是一個運算符,它是你如何聲明一個參數化類型。

在Java 5之前,你不能說你的List是一個「List of something」,只是一個沒有類型的List。所以,當你把一個對象從你的列表,你必須將它轉換回特定類型:

List strings = new ArrayList(); 
strings.add("hello"); 
String s = (String) strings.get(0); 

使用Java 5,您可以指定元素的類型,使用尖括號:

List<String> strings = new ArrayList<String>(); 
strings.add("hello"); 
String s = strings.get(0); 

因爲您現在知道元素的確切類型,所以您不必再投射從列表中獲得的對象。此外,編譯器不會讓你在列表中添加不兼容的對象:

List<String> strings = new ArrayList<String>(); 
strings.add(42); // Compiler error : expected a String, got an int