Lenskit技术问题:如何将ArrayList中的评分添加至EventCollectionDao?
解决LensKit EventCollectionDAO初始化时的NoSuchMethodError问题
看起来你遇到的是LensKit依赖版本不匹配引发的方法缺失错误,java.lang.NoSuchMethodError这类问题几乎都是因为项目中依赖的组件版本不一致,或者使用的版本里目标方法不存在/签名不匹配导致的。
问题根源
你初始化EventCollectionDAO时,它的构造函数(第58行)试图调用org.grouplens.lenskit.collections.CollectionUtils.fast()方法,但当前你的项目classpath中的LensKit collections模块版本,和data模块版本不兼容——要么是collections模块版本太旧没有这个方法,要么是版本冲突导致加载了错误的类文件。
解决方案
1. 统一所有LensKit依赖的版本
LensKit提供了BOM(物料清单)来统一管理所有组件的版本,避免版本不一致的问题。如果用Maven,你可以在pom.xml中添加依赖管理:
<dependencyManagement> <dependencies> <dependency> <groupId>org.lenskit</groupId> <artifactId>lenskit-bom</artifactId> <version>3.0</version> <!-- 选用稳定的最新版本,比如3.x系列 --> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
然后在依赖声明中只需要指定artifactId,无需重复写版本号:
<dependencies> <dependency> <groupId>org.lenskit</groupId> <artifactId>lenskit-core</artifactId> </dependency> <dependency> <groupId>org.lenskit</groupId> <artifactId>lenskit-data-structures</artifactId> </dependency> </dependencies>
Gradle用户也可以用类似的方式导入BOM来统一版本。
2. 排查classpath中的依赖冲突
检查你的项目是否同时存在多个版本的LensKit collections相关jar包。比如在IDE中打开依赖树(Maven可以用mvn dependency:tree命令),找到冲突的依赖并排除掉旧版本或不需要的版本。
3. 简化你的初始化代码
顺便提一句,你的代码可以更简洁——EventCollectionDAO支持直接传入可变参数的事件,不用手动创建ArrayList:
// 直接传入单个Rating实例 EventCollectionDAO dao = new EventCollectionDAO(Ratings.make(1, 2, 3)); // 如果有多个Rating,也可以直接传: EventCollectionDAO dao = new EventCollectionDAO( Ratings.make(1, 2, 3), Ratings.make(4, 5, 2.5) );
内容的提问来源于stack exchange,提问作者theNoobProgrammer
相关产品推荐
相关产品推荐

