2012-11-20 23 views
6

Tôi đã viết một trình phân tích cú pháp cho định dạng tệp có tên ASN.1 sử dụng số TypeLiteral.getFieldType(Field) của Guice để chuyển đổi các trường chung thành các loại Java cụ thể để tôi có thể tạo đúng loại (tương tự như dữ liệu Jackson hoặc GSON). Nhưng vì tôi đã phụ thuộc vào ổi và có vẻ như có một sự thay thế TypeLiteral mới, tôi muốn sử dụng TypeToken thay thế. Theo Guave TypeToken documentation:TypeToken của Guava có thể nhận được loại trường chung chung không?

TypeToken cũng tương tự như lớp TypeLiteral Guice, nhưng với một sự khác biệt quan trọng: nó hỗ trợ các loại phi reified như T, List<T> hoặc thậm chí List<? extends Number>; trong khi TypeLiteral thì không. TypeToken cũng có thể tuần tự hóa và cung cấp nhiều phương thức tiện ích bổ sung.

Bạn có thể lấy loại trường được hợp nhất bằng TypeToken không? Nói cách khác, làm thế nào tôi có thể làm như sau trong ổi?

import org.junit.Test; 
import com.google.inject.TypeLiteral; 
public class FieldTypeTest { 
    public static class A<T> { 
     T a; 
    } 
    public static class B { 
     A<String> b; 
    } 

    @Test 
    public void testTypeToken() throws SecurityException, NoSuchFieldException { 
     TypeLiteral<?> reifiedA = TypeLiteral.get(B.class).getFieldType(B.class.getDeclaredField("b")); 
     assertEquals(String.class, reifiedA.getFieldType(reifiedA.getRawType().getDeclaredField("a")).getRawType()); 
    } 
} 

Trả lời

7

Từ đầu tôi, không xác nhận

Type t = B.class.getDeclaredField("b").getGenericType(); 
Class<?> p = TypeToken.of(t).resolve(
     /* T */ A.getTypeParameters()[0]).getRawType(); 
// p should be String.class 
+2

Cảm ơn, getGenericType() và quyết tâm() là những gì tôi cần. \t \t TypeToken reifiedA = TypeToken.of (B.class) .resolveType (B.class.getDeclaredField ("b"). GetGenericType()); \t \t assertEquals (String.class, reifiedA.resolveType (reifiedA.getRawType(). GetDeclaredField ("a"). GetGenericType()). GetRawType()); – yonran

+0

Câu trả lời này xứng đáng là +50! Tôi đã tìm kiếm điều này trong 3 ngày và bạn đã cứu mạng tôi! –

+0

Tôi rất vui khi biết điều đó :) –

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