@Test @SneakyThrows public void generics() { SimpleAttribute<Car, List<String>> FEATURES_LIST = new SimpleAttribute<Car, List<String>>("features") { @SneakyThrows @Override public Type getAttributeReflectedType() { return AbstractAttributeIndexTest.class.getField("list").getGenericType(); } @Override public List<String> getValue(Car car, QueryOptions queryOptions) { return car.getFeatures(); } }; AttributeIndex index = new AttributeIndex<>(FEATURES_LIST, new HashSet<Class<? extends Query>>() {{}}); list = Arrays.asList("Hello"); TypeResolver typeResolver = new TypeResolver(); ResolvedType klassType = typeResolver.resolve(getClass().getField("list").getGenericType()); TypeHandler listTypeHandler = TypeHandler.lookup(klassType); ByteBuffer buffer = ByteBuffer.allocate(index.attributeSerializer.size(listTypeHandler, list)); index.attributeSerializer.serialize(listTypeHandler, list, buffer); buffer.rewind(); List<String> deserialized = (List<String>) index.attributeDeserializer.deserialize(listTypeHandler, buffer); assertEquals(deserialized.get(0), list.get(0)); } }