实现泛型接口时,如何使用具体类作为setField方法的参数?
问题分析与解决方案
原因
Java方法重写要求参数类型必须与父类/接口的方法参数完全匹配(仅返回值支持协变,参数不允许协变)。原接口AssignmentInterface<T>中setField的参数是MetadataFieldInterface<T>,而实现类里用DatasetAcquisitionMetadataField作为参数属于参数类型缩小,不符合重写规则,因此编译报错。
解决方案
给AssignmentInterface新增一个泛型参数,用来指定具体的MetadataFieldInterface实现类,让实现类可以直接使用子类类型作为方法参数:
1. 修改接口定义
public interface AssignmentInterface<T, F extends MetadataFieldInterface<T>> { F getField(); void setField(F field); }
2. 修改实现类
public class DatasetAcquisitionAssignment implements AssignmentInterface<DatasetAcquisition, DatasetAcquisitionMetadataField> { @Override public DatasetAcquisitionMetadataField getField() { // 实现逻辑 ... } @Override public void setField(DatasetAcquisitionMetadataField field) { // 实现逻辑 ... } }
调整后,接口的泛型参数F明确限定为MetadataFieldInterface<T>的子类,实现类指定具体的DatasetAcquisitionMetadataField作为F的类型,此时setField方法的参数类型完全匹配接口定义,既满足重写要求,又能直接使用目标子类作为参数,避免了后续Jackson运行时问题。
内容的提问来源于stack exchange,提问作者Julien
相关产品推荐
相关产品推荐

