<T> (dấu ngoặc góc) có nghĩa là gì trong Java?


139

Tôi hiện đang nghiên cứu Java và gần đây đã bị cản trở bởi dấu ngoặc nhọn (<>). Chính xác thì chúng có ý nghĩa gì?

public class Pool<T>{
    public interface PoolFactory<T>{
        public T createObject();
    }
    this.freeObjects = new ArrayList<T>(maxsize)
}

<T>nghĩa là gì? Có nghĩa là tôi có thể tạo một đối tượng kiểu T?


4
Tôi thấy thật khó để phân tích mã của bạn. Không có vết lõm để bắt đầu, và có hai niềng răng mở và chỉ có một đóng. Được T createObjectcho là ở bên trong Pool hoặc PoolFactory? Nơi nào được this.freeObjects = ...cho là? Đó có phải là một ví dụ riêng biệt? Nó là bất hợp pháp để có nó ở đó; nó phải ở trong một phương thức
mgiuca

Nếu ai đó đang tìm kiếm thông tin về <>(nhà điều hành kim cương) có thể được sử dụng như List<Integer> list = new ArrayList<>();truy cập docs.oracle.com/javase/7/docs/technotes/guides/lingu/ù .
Pshemo

Câu trả lời:


161

<T>chung chung và thường có thể được đọc là "loại T". Nó phụ thuộc vào loại bên trái của <> ý nghĩa thực sự của nó.

Tôi không biết a Poolhoặc PoolFactorylà gì, nhưng bạn cũng đề cập ArrayList<T>, đó là một lớp Java tiêu chuẩn, vì vậy tôi sẽ nói về điều đó.

Thông thường, bạn sẽ không thấy "T" trong đó, bạn sẽ thấy một loại khác. Vì vậy, nếu bạn thấy ArrayList<Integer>ví dụ, điều đó có nghĩa là "An ArrayListof Integers." Ví dụ, nhiều lớp sử dụng khái quát để hạn chế loại phần tử trong một thùng chứa. Một ví dụ khác là HashMap<String, Integer>"bản đồ với Stringcác khóa và Integergiá trị".

Ví dụ Pool của bạn hơi khác một chút, vì ở đó bạn đang xác định một lớp. Vì vậy, trong trường hợp đó, bạn đang tạo một lớp mà người khác có thể khởi tạo với một loại cụ thể thay cho T. Ví dụ: tôi có thể tạo một đối tượng loại Pool<String>bằng định nghĩa lớp của bạn. Điều đó có nghĩa là hai điều:

  • My Pool<String>sẽ có một giao diện PoolFactory<String>với một createObjectphương thức trả về Strings.
  • Trong nội bộ, Pool<String>sẽ chứa một ArrayListchuỗi.

Đây là một tin tuyệt vời, bởi vì vào một thời điểm khác, tôi có thể đi cùng và tạo ra một mã Pool<Integer>sẽ sử dụng cùng một mã, nhưng có Integerbất cứ nơi nào bạn nhìn thấy Ttrong nguồn.


3
Một trong những lời giải thích tốt nhất mà tôi đã thấy cho đến nay :) Được đánh giá cao!.
Suhas Chikkanna

34

Nó thực sự đơn giản. Đây là một tính năng mới được giới thiệu trong J2SE 5 . Chỉ định dấu ngoặc nhọn sau tên lớp có nghĩa là bạn đang tạo kiểu dữ liệu tạm thời có thể chứa bất kỳ loại dữ liệu nào.

Thí dụ:

class A<T>{
    T obj;
    void add(T obj){
        this.obj=obj;
    }
    T get(){
        return obj;
    }
}
public class generics {
    static<E> void print(E[] elements){
        for(E element:elements){
            System.out.println(element);
        }
    }

    public static void main(String[] args) {
        A<String> obj=new A<String>();
        A<Integer> obj1=new A<Integer>();
        obj.add("hello");
        obj1.add(6);
        System.out.println(obj.get());
        System.out.println(obj1.get());

        Integer[] arr={1,3,5,7};
        print(arr);
    }
}

Thay vì <T>, bạn thực sự có thể viết bất cứ điều gì và nó sẽ hoạt động theo cùng một cách. Hãy thử viết <ABC>tại chỗ <T>.

Điều này chỉ để thuận tiện:

  • <T> được gọi là bất kỳ loại
  • <E> như kiểu phần tử
  • <N> như loại số
  • <V> như giá trị
  • <K> làm chìa khóa

Nhưng bạn có thể đặt tên cho nó bất cứ điều gì bạn muốn, nó không thực sự quan trọng.

Hơn nữa, Integer, String, Booleanvv là lớp wrapper của Java mà giúp đỡ trong việc kiểm tra các loại quá trình biên dịch. Ví dụ, trong đoạn mã trên, objcó kiểu String, vì vậy bạn không thể thêm bất kỳ loại nào khác vào nó (thử obj.add(1), nó sẽ báo lỗi). Tương tự, obj1Integerloại, bạn không thể thêm bất kỳ loại nào khác vào nó (thử obj1.add("hello"), lỗi sẽ ở đó).


23

Nó có liên quan đến generic trong java. Nếu tôi đã đề cập ArrayList<String>điều đó có nghĩa là tôi chỉ có thể thêm đối tượng kiểu Chuỗi vào ArrayList đó.

Hai lợi ích chính của thuốc generic trong Java là:

  1. Giảm số lượng phôi trong chương trình của bạn, do đó giảm số lượng lỗi tiềm ẩn trong chương trình của bạn.
  2. Cải thiện mã rõ ràng

11

được gọi là một loại chung. Bạn có thể khởi tạo một đối tượng Pool như thế này:

PoolFactory<Integer> pool = new Pool<Integer>();

Tham số chung chỉ có thể là một loại tham chiếu. Vì vậy, bạn không thể sử dụng các kiểu nguyên thủy như int hoặc double hoặc char hoặc các kiểu nguyên thủy khác.


9

<>được sử dụng để chỉ ra thuốc generic trong Java.

Tlà một tham số loại trong ví dụ này. Và không: khởi tạo là một trong số ít những điều bạn không thể làm với T.

Ngoài hướng dẫn được liên kết ở trên, Angelika Langers Generics FAQ là một tài nguyên tuyệt vời về chủ đề này.


8

Các lớp chung là một loại lớp lấy một kiểu dữ liệu làm tham số khi nó được tạo. Tham số loại này được chỉ định bằng cách sử dụng dấu ngoặc góc và loại có thể thay đổi mỗi khi một thể hiện mới của lớp được khởi tạo. Chẳng hạn, hãy tạo một ArrayList cho các đối tượng Nhân viên và một đối tượng khác cho các đối tượng Công ty

ArrayList<Employee> employees = new ArrayList<Employee>();
ArrayList<Company> companies = new ArrayList<Company>();

Bạn sẽ nhận thấy rằng chúng tôi đang sử dụng cùng một lớp ArrayList để tạo cả hai danh sách và chúng tôi chuyển vào loại Nhân viên hoặc Công ty bằng cách sử dụng dấu ngoặc nhọn. Có một lớp chung có thể xử lý nhiều loại dữ liệu cắt giảm việc có nhiều lớp thực hiện các nhiệm vụ tương tự. Generics cũng giúp cắt giảm các lỗi bằng cách cung cấp cho mọi thứ một loại mạnh giúp trình biên dịch chỉ ra lỗi. Bằng cách chỉ định một loại cho ArrayList, trình biên dịch sẽ đưa ra lỗi nếu bạn cố gắng thêm Nhân viên vào danh sách Công ty hoặc ngược lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.