2010-11-27 63 views
5

Tôi mới dùng Java nhưng không lập trình (tôi thường viết mã bằng Ruby). Một điều tôi đã thấy trong các ví dụ về mã Java là sử dụng <> thay vì() để chuyển các tham số cho một đối tượng. Dưới đây là ví dụ về mã (được lấy từ hướng dẫn của Bộ công cụ trên web của Google):Object <String> có ý nghĩa gì trong Java?

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

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

Nó có liên quan đến việc đúc hay là gì khác không? Ai đó có thể giải thích cho tôi điều này có nghĩa gì hoặc được sử dụng để làm gì? Cảm ơn!

Trả lời

4

Đó là một type parameter cho một lớp generic. Về cơ bản, ValueChangeEvent<String> đại diện cho một sự kiện đã thông báo cho người nghe biết rằng giá trị đã thay đổi và trong trường hợp này giá trị là loại String.

Đó là dễ hiểu với ví dụ tiêu chuẩn trong khuôn khổ bộ sưu tập:

Một List<String> là một List chứa String đối tượng. Lợi thế so với chỉ sử dụng "kiểu thô" List là trình biên dịch sẽ từ chối mã đặt bất kỳ thứ gì ngoại trừ String đối tượng vào một List<String> và cho phép đối tượng truy xuất từ ​​nó để sử dụng làm String mà không cần truyền. Về cơ bản, generics cho phép mã sạch hơn và cải thiện an toàn loại tổng thể của mã Java bằng cách làm cho nó không cần thiết trong nhiều trường hợp để làm việc với các loại Object và đúc các giá trị từ nó.

3

Nó được gọi là generics hoặc thông số chung. Chúng cho phép một phương thức hoặc đối tượng hoạt động trên nhiều loại dữ liệu trong khi vẫn duy trì an toàn loại. Một cách sử dụng phổ biến là xác định loại đối tượng được lưu trữ trong bộ sưu tập là gì.

Xem wikipedia article về chủ đề để biết thêm thông tin.

+0

... nhưng như wiki cũng sẽ cho bạn biết, các Generics trong Java không hoàn toàn an toàn vì loại xóa đi. – delnan

+0

Chúng cung cấp sự an toàn tốt hơn nhiều so với Java trước khi Generics, nơi bạn phải trả về một 'Object' và tự tin tưởng để đúc nó đúng cách, không cung cấp thời gian kiểm tra biên dịch. Có, loại tẩy xóa bóng một số lần (đặc biệt là với mảng), nhưng nó là * nhiều * tốt hơn so với không có gì. –

0

<> biểu thị generics. Hãy xem Generics. Ví dụ: List<String> là danh sách các chuỗi.

0

này được gọi là generics trong java. Chúng tương tự như templates trong C++. Về cơ bản, chúng cho phép bạn triển khai một lớp chung cho bất kỳ loại nào và sau đó khi bạn khởi tạo biến của lớp này, bạn chỉ định loại nào (ví dụ: Chuỗi, int, double, v.v.) nó áp dụng công cụ của nó. Một ví dụ tốt là trong một ArrayList, loại container nào nên lưu trữ? Việc thực hiện là như nhau, chỉ có loại khác nhau.

+0

Giả sử rằng chúng tương tự như các mẫu trong C++ sẽ là IMO sai vì các mẫu cơ bản hoạt động ở một cấp độ rất khác khi so sánh với generics. Đọc Moar: http://stackoverflow.com/questions/36347/what-are-the-differences-between-generic-types-in-c-and-java/498329#498329 –

1

Việc sử dụng dấu ngoặc nhọn thường biểu thị các phương pháp lập trình chung, đây là một kiểu lập trình mà các loại không được khai báo ban đầu, làm cho mã trở nên dễ sử dụng hơn.

Ví dụ:

// 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

Nó thường được sử dụng để bạn có thể tin tưởng rằng một phần tử của một bộ sưu tập/danh sách là một loại nhất định.

Ví dụ,

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

myFunctionWhichAcceptsString(a.get(0)); 

Nếu myFunctionWhichAcceptsString chỉ chấp nhận một chuỗi làm tham số, bạn sẽ không thể sử dụng một ArrayList bình thường mà không đúc kết quả như một String, vì nó lưu giữ một đối tượng và đối tượng ≠ Chuỗi. Bằng cách làm theo cách này bạn đang nói rằng danh sách phải là chỉ Strings. Bạn có thể làm điều này cho bất kỳ loại đối tượng nào.

Các vấn đề liên quan