2013-02-24 22 views
6

Tôi đang sử dụng lớp ổi TypeToken ổi để kiểm tra xem trường hợp của một loại tùy ý có thể được gán cho các đối tượng thuộc loại khác không.Tìm hiểu Type_Token.isAssignable của GuavaTừ phương thức

Trong đoạn mã sau đây, tôi đang thử nghiệm nếu loại khai báo là List là chuyển nhượng từ List<String>, và ngược lại:

TypeToken rawListType = new TypeToken<List>(){}; 
TypeToken parameterizedListType = new TypeToken<List<String>>(){}; 
System.out.println(rawListType.isAssignableFrom(parameterizedListType)); //true 
System.out.println(parameterizedListType.isAssignableFrom(rawListType)); //false 

Tại sao cuộc gọi thứ hai để isAssignableFrom lợi nhuận false, cho rằng đoạn code dưới đây biên dịch , vì vậy tôi có thể gán List<String> từ List (với một cảnh báo):

List l = null; 
List<String> l2 = null; 
l = l2; 
l2 = l; //Type Safety Warning 

trực giác của tôi là ổi được trả lời nếu ins tances của các loại này được gán mà không có cảnh báo (?). Nếu đó là chính xác, làm thế nào tôi có thể kiểm tra khả năng chuyển nhượng theo nghĩa của trình biên dịch cho phép tôi gán một đối tượng cho một đối tượng khác (có hoặc không có cảnh báo), giống như nó được hiển thị trong đoạn mã thứ hai?

Trả lời

3

Như bạn đã nói, chúng tôi biết trình biên dịch sẽ cho phép loại chung được gán từ loại thô, nhưng điều đó không có nghĩa là khả năng gán. Trình biên dịch đang làm một diễn viên không được kiểm soát ẩn (do đó cảnh báo).

Vì bạn thực sự muốn kiểm tra khả năng gán của các loại thô tương ứng, bạn chỉ có thể sử dụng TypeToken.getRawType và sau đó sử dụng Class.isAssignableFrom.

EDIT: Như bạn đã chỉ ra, phương pháp này sẽ tính List<Integer>List<String> được gán cho và từ mỗi khác. Để tránh điều đó, tôi nghĩ bạn cần giải pháp tổng quát hơn:

boolean checkRawAssignability(TypeToken<?> assigned, TypeToken<?> from) { 

    //if from is a raw type, compare raw types instead 
    final Type fromType = from.getType(); 
    if (fromType instanceof Class<?>) { 
     return assigned.getRawType().isAssignableFrom((Class<?>)fromType); 
    } 

    //otherwise use normal methodology 
    return assigned.isAssignableFrom(from); 
} 

Lưu ý rằng giải pháp này không xem xét các loại mảng.

+0

hi @Paul. Nó không phải là chính xác những gì tôi đang tìm kiếm, nếu tôi kiểm tra khả năng gán kiểu thô, thì Danh sách sẽ được chuyển nhượng từ Danh sách và cứ như vậy, và điều này là không chính xác. Tôi đang tìm kiếm một cách để xác minh khả năng chuyển nhượng ngay cả trong trường hợp trình biên dịch sẽ phải thêm các phôi ngầm ẩn sau sân. – Sergio

+0

Đã hiểu - hãy xem cập nhật của tôi. –

+0

giải pháp của bạn có vẻ đúng với tôi, bạn có biết tại sao TypeToken không làm điều này không? Ít nhất họ cũng nên ghi lại rằng trong phương pháp javadoc tôi nghĩ. – Sergio

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