Java中如何使用EasyRandom生成Map<Author, List<Book>>随机对象?
你的代码编译失败的核心原因是:无法直接获取ArrayList<Book>.class这种带泛型参数的Class对象——Java泛型存在类型擦除,编译后泛型信息会被抹除,ArrayList<Book>和ArrayList的Class对象是同一个,直接写ArrayList<Book>.class属于语法错误。
下面是两种可行的解决方式:
方法1:直接用EasyRandom的nextObject方法(推荐)
这是最简洁的方式,通过TypeToken定义完整的泛型类型,让EasyRandom自动处理:
import org.jeasy.random.EasyRandom; import com.google.common.reflect.TypeToken; Type mapType = new TypeToken<Map<Author, List<Book>>>() {}.getType(); EasyRandom easyRandom = new EasyRandom(); Map<Author, List<Book>> randomMap = easyRandom.nextObject(mapType);
如果不想引入Guava,也可以手动构造参数化类型:
import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; Type mapType = new ParameterizedType() { @Override public Type[] getActualTypeArguments() { return new Type[]{ Author.class, new ParameterizedType() { @Override public Type[] getActualTypeArguments() { return new Type[]{Book.class}; } @Override public Type getRawType() { return List.class; } @Override public Type getOwnerType() { return null; } } }; } @Override public Type getRawType() { return Map.class; } @Override public Type getOwnerType() { return null; } }; EasyRandom easyRandom = new EasyRandom(); Map<Author, List<Book>> randomMap = easyRandom.nextObject(mapType);
方法2:手动创建MapRandomizer
如果坚持要使用MapRandomizer,需要给它传递带泛型信息的Type对象,而不是普通的Class:
import org.jeasy.random.randomizer.MapRandomizer; import org.jeasy.random.util.TypeUtils; // 构造List<Book>的参数化类型 ParameterizedType listValueType = TypeUtils.parameterize(List.class, Book.class); // 创建MapRandomizer,键类型为Author.class,值类型为带泛型的List<Book> MapRandomizer<Author, List<Book>> mapRandomizer = new MapRandomizer<>(Author.class, listValueType); // 生成随机对象 Map<Author, List<Book>> randomMap = mapRandomizer.getRandomValue();
注意:TypeUtils是EasyRandom提供的工具类,用来简化参数化类型的构造。
内容的提问来源于stack exchange,提问作者paymer
相关产品推荐
相关产品推荐

