2008-12-10 34 views
10

Ví dụ, tôi có thể viết một trong những:Trong Java, khi nào tôi nên sử dụng "Object o" thay vì Generics?

class example <T> 
{ 
    ... 

    public void insert (T data) 
    { 
     ... 
    } 
} 

hoặc

class example 
{ 
    ... 

    public void insert (Object o) 
    { 
     ... 
    } 
} 

Có một sự khác biệt signficant giữa 2 về hiệu suất? Với generics tôi có thể hạn chế kiểu tham số và với cách tiếp cận thứ hai, tôi đoán nó sẽ không cần thiết để xác định kiểu của đối tượng khi nó được tạo ra.

Ngoài ra, với phương pháp thứ hai tôi về cơ bản có thể chèn bất kỳ thứ gì vào lớp học, phải không? Trong khi với generics thì mọi yếu tố trong lớp sẽ cùng loại.

Còn bất cứ điều gì khác tôi bị thiếu?

Trả lời

9

Lý do duy nhất để viết sau là nếu bạn phải nhắm mục tiêu một JVM trước đó. Generics được thực hiện bởi loại-erasure, do đó, họ không có tác động thời gian chạy - chỉ thêm biên dịch kiểm tra thời gian mà sẽ cải thiện mã của bạn. Tất nhiên nếu bạn cần một bộ sưu tập chứa bất kỳ đối tượng cũ nào, hoặc kết hợp một số không có một lớp cha chung, bạn cần biến thể Object đơn giản (nhưng sau đó lớp học của bạn vẫn có thể chung chung và được tạo mới với ... < Đối tượng >).

6

Tôi nghĩ bạn đã đóng góp rất nhiều. Không có sự khác biệt về hiệu suất. Generics được hợp lý hóa (Type Erasure) khi mã được biên dịch và không tồn tại nữa khi chạy. Họ chỉ cần thêm phôi khi cần thiết và thực hiện kiểm tra kiểu như bạn đã nêu. Neal Gafter đã viết một cái nhìn tổng quan tốt đẹp về cách họ làm việc, các vấn đề hiện tại với Generics và cách chúng có thể được giải quyết trong phiên bản Java tiếp theo: http://gafter.blogspot.com/2006/11/reified-generics-for-java.html

3

Không có sự khác biệt về hiệu suất.

Tuy nhiên, Java không cung cấp phương sai tham số, do đó, có những tình huống mà bạn sẽ ghi đè các chức năng tiền-generics như bằng, compareTo, v.v., nơi bạn sẽ phải sử dụng Đối tượng.

+0

Yeap. Đây sẽ là lý do duy nhất. Nếu bạn muốn kết hợp các loại dữ liệu khác nhau, sử dụng Generics sẽ không làm được. Ví dụ trộn ... mmhh ... Chuỗi và nhân viên ở cùng một nơi (tại sao bạn làm điều đó, tôi không biết) – OscarRyz

0

Một số cuộc gặp gỡ mà tôi phải sử dụng 'Object' thay vì Generics là những thứ bắt buộc hơn là lựa chọn. Khi làm việc với các mã tiền bối hoặc thư viện được xây dựng xung quanh api tiền chung, người ta có rất ít sự lựa chọn. Proxy động chẳng hạn, Proxy.newProxy() trả về kiểu Object. Thông qua bối cảnh chung (nơi mà một ngữ cảnh có thể là bất cứ điều gì) là một ví dụ khác. Một số người bạn của tôi cho rằng đó là tốt như không có generics. Theo như hiệu suất là có liên quan, không nên có bất kỳ chi phí, xem xét loại tẩy xoá.

0

Về hiệu suất, tôi đồng ý với những người ở trên.

Về quan điểm này của bạn

"Ngoài ra, với cách tiếp cận thứ hai tôi có thể về cơ bản chèn bất cứ điều gì vào lớp, phải không? Trong khi đó, với Generics mọi phần tử trong lớp sẽ cùng loại."

Một ưu điểm nữa của generics là có một kiểu kiểm tra để gán cho cá thể ví dụ.

Ví dụ: bạn có ví dụ e1 và một ví dụ e2 khác, loại an toàn sẽ được duy trì và bạn sẽ không bao giờ có thể thực hiện e1 = e2;

khi có ví dụ đối tượng, điều đó có thể thực hiện được.

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