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ớpTypeLiteral
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 khiTypeLiteral
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());
}
}
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
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! –
Tôi rất vui khi biết điều đó :) –