2013-08-07 13 views
5

Tôi đang xem mẫu vùng chứa không đồng nhất từ ​​Java hiệu quả của Bloch và tôi đang cố gắng xác định lý do tham chiếu lớp là cần thiết khi chèn đối tượng vào vùng chứa không đồng nhất. Tôi không thể sử dụng instance.getClass() để nhận tham chiếu này? Không phải của JPA là entity manager một ví dụ về điều này?Khi chèn các đối tượng vào một thùng chứa không đồng nhất loại an toàn, tại sao chúng ta cần tham chiếu lớp?

interface BlochsHeterogeneousContainer { 

    <T> void put(Class<T> clazz, T instance); 

    <T> T get(Class<T> clazz); 
} 

interface AlternativeHeterogeneousContainer { 

    // Class<T> not needed because we can use instance.getClass() 
    <T> void put(T instance); 

    <T> T get(Class<T> clazz); 
} 

Trả lời

5

Không, bạn không thể làm điều đó vì nó sẽ không cung cấp cho bạn loại tham chiếu trong trường hợp thừa kế, thay vì loại đối tượng thực tế.

Hãy xem xét ví dụ sau:

Number num = new Integer(4); 
System.out.println(num.getClass()); 

này sẽ in:

class java.lang.Integer 

và không java.lang.Number.

+0

+1 Chính xác, vì vậy giao diện cho phép 'đặt (Số.class, num)' hoặc 'đặt (Integer.class, num)' khi thích hợp. –

+0

'put (Integer.class, num)' sẽ ném một lỗi trình biên dịch. Điều này có ý nghĩa vì các loại đối số là (Loại , Số). Bạn không thể đặt T thành Số nguyên vì Số không phải là Số nguyên. Bạn không thể đặt T thành số vì Lớp không phải là Lớp . Tuy nhiên, nó vẫn hữu ích khi có một tham số kiểu vì bạn có thể làm những việc như 'put (Object.class, num)'. Trong trường hợp này, T được đặt thành Object (và tất cả các số là các đối tượng để nó hoạt động). – Cod3Citrus

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