You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何使用EasyRandom生成Map<Author, List<Book>>随机对象?

解决EasyRandom生成Map<Author, List>的编译问题

你的代码编译失败的核心原因是:无法直接获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 03:48:30