Java封装类调用isAssignableFrom方法返回结果与预期不符问题求助
问题核心原因
你搞反了Class.isAssignableFrom方法的调用顺序,该方法的语义如下:
A.class.isAssignableFrom(B.class)的含义为:B类型的实例可以直接赋值给A类型的变量,也就是B是A的子类/实现类/子接口时返回true,否则返回false。
代码逻辑错误点
你的IAuthorityDetailRepository是IRepositoryEntityFramework的子接口,符合预期返回true的写法应该是:
// 判断子接口能否赋值给父接口,返回true IRepositoryEntityFramework.class.isAssignableFrom(IAuthorityDetailRepository.class)
而你在Argument类的isAssignableFrom方法里的写法是:
// 等价于判断父接口能否赋值给子接口,本来就应该返回false localClassValue.isAssignableFrom(classInstance)
这里localClassValue是IAuthorityDetailRepository.class,传入的classInstance是IRepositoryEntityFramework.class,逻辑是判断父接口是不是子接口的子类型,返回false完全符合语法规则。
直接测试返回true的原因排查
你贴出的直接测试代码本身运行应该返回false,出现返回true的情况只有两种可能:
- 实际测试时你把两个类的调用顺序写反了,调用的是
argumentClassValue.isAssignableFrom(localClassValue) - 项目里存在两个不同包路径的同名
IRepositoryEntityFramework接口,你测试时导入的包和Argument类里用到的包不一致
修复方案
把Argument类的isAssignableFrom方法的调用顺序调换即可:
@SuppressWarnings({ "rawtypes", "unchecked" }) public boolean isAssignableFrom (Class classInstance) { if (classInstance == null || this.classMetadata == null) return false; Class localClassValue = this.classMetadata.getClazz(); if (localClassValue == null) return false; // 调换两个类的判断顺序 return classInstance.isAssignableFrom(localClassValue); }
另外你初始化ClassMetadata时用了原始类型,建议补全泛型避免潜在的类型擦除问题:
// 补全菱形运算符 ClassMetadata<IAuthorityDetailRepository> authorityDetailRepositoryMetadata = new ClassMetadata<>(3,IAuthorityDetailRepository.class );
内容的提问来源于stack exchange,提问作者tahasozgen
相关产品推荐
相关产品推荐

