2010-11-27 95 views
5

我是新來的Java,但不是編程(我通常在Ruby代碼)。我在Java代碼示例中看到的一件事是使用<>而不是()將params傳遞給對象。下面是一個代碼示例(取自Google Web Toolkit教程):對象<String>是什麼意思Java?

public void onValueChange(ValueChangeEvent<String> event) { 
    String token = event.getValue(); 

    // depending on the value of the token, do whatever you need 
    ... 
} 

它是否與鑄造有關?還是別的嗎?有人可以向我解釋這是什麼意思或用於什麼?謝謝!

回答

4

這是一個通用類type parameter。基本上,ValueChangeEvent<String>代表一個事件,通知監聽者一個值已更改,在這種情況下,該值的類型爲String

它更容易理解與集合框架標準的例子:

一個List<String>List包含String對象。只是用「原始類型」 List過的優點是編譯器將拒絕該放任何東西,除了String對象爲List<String>代碼,並允許從中檢索到的對象用作String沒有鑄造。

基本上,泛型允許使用更清晰的代碼,並且通過在很多情況下使用Object類型並從中強制轉換值來提高Java代碼的整體類型安全性。

3

它被稱爲泛型或泛型參數。它們允許方法或對象在保持類型安全的同時對多種類型的數據進行操作。一個常用的用途是指定集合中存儲的對象的類型。

wikipedia article以獲取更多信息的主題。

+0

......但是,由於wiki會告訴你,Java中的泛型並不完全類型安全,因爲該死的刪除類型。 – delnan 2010-11-27 21:24:39

+0

它們提供比預泛型java更好的類型安全性,您必須返回一個`Object`並相信自己可以正確地轉換它,因此不會提供編譯時檢查。是的,輸入擦除次數很多次(特別是在陣列中),但它比沒有更好。 – 2010-11-27 21:27:00

0

<>意味着仿製藥。看看Generics。例如,List<String>是一個字符串列表。

0

這被稱爲Java中generics。它們與C++中的templates類似。

他們基本上讓你實現一個通用類,使用任何類型的,然後當你初始化這個類,你指定的一個變量是什麼類型(例如字符串,整型,雙等),它適用的東西。一個很好的例子是在ArrayList中,容器應該存儲什麼類型?實現是一樣的,只有類型不同。

1

使用角撐架的通常表示通用的編程方法,它是編程風格,其中類型不最初聲明,使得代碼更加可重複使用的。

例如:

// Declare the generic class 
public class GenericList<T> 
{ 
    void Add(T input) { } 
} 
class TestGenericList 
{ 
    private class ExampleClass { } 
    static void Main() 
    { 
     // Declare a list of type int 
     GenericList<int> list1 = new GenericList<int>(); 

     // Declare a list of type string 
     GenericList<string> list2 = new GenericList<string>(); 

     // Declare a list of type ExampleClass 
     GenericList<ExampleClass> list3 = new GenericList<ExampleClass>(); 
    } 
} 
0

它通常使用的,所以你可以相信的集合/列表的元素是某一類型。

例如,

ArrayList<String> a = new ArrayList(); 
a.add("Test"); 

myFunctionWhichAcceptsString(a.get(0)); 

如果myFunctionWhichAcceptsString只接受一個字符串作爲參數,你將無法使用正常的ArrayList沒有鑄造結果爲字符串,因爲它存儲的對象和Object≠字符串。通過這樣做你就是說列表只能是字符串。您可以對任何類型的對象執行此操作。