Java泛型进阶示例纠错:含继承与接口的复杂实现问题
Java泛型继承与接口实现错误修正方案
核心错误原因
- 基类
BaseObjectData<T>的泛型T无任何约束,编译器无法确认T具备getId()、getObjectValue1()等方法,导致编译报错。 - 子类
InheritLevel1Data继承基类时未指定泛型参数,泛型信息丢失,且同样存在无约束泛型导致的方法调用问题。 - 测试类使用原始类型声明列表,未利用泛型类型安全特性,存在强制转换风险。
修正后完整代码
1. 接口与Difference记录(无需修改)
public interface ComparatorBase<T> { List<Difference> isSame(T otherObject); } public record Difference(String id, String left, String right) { }
2. 修正后的基类BaseObjectData
添加泛型约束,确保T类型继承自身,从而可以安全调用基类方法:
@NoArgsConstructor @AllArgsConstructor @Setter @Getter @Builder public class BaseObjectData<T extends BaseObjectData<T>> implements ComparatorBase<T> { private String id; private String objectValue1; private String objectValue2; @Override public List<Difference> isSame(T otherObject) { List<Difference> differences = new ArrayList<>(); if (otherObject != null && !getObjectValue1().equals(otherObject.getObjectValue1())) { differences.add(new Difference(getId(), getObjectValue1(), otherObject.getObjectValue1())); } if (otherObject != null && !getObjectValue2().equals(otherObject.getObjectValue2())) { differences.add(new Difference(getId(), getObjectValue2(), otherObject.getObjectValue2())); } return differences; } T findMatchingObject(List<T> otherObjects) { if (otherObjects == null) return null; for (T object : otherObjects) { if (object.getId().equals(id)) { return object; } } return null; } }
3. 修正后的子类InheritLevel1Data
明确泛型类型为自身,继承基类时指定泛型参数,确保可以调用子类独有的getObjectValue3()方法:
@NoArgsConstructor @AllArgsConstructor @Getter @Setter public class InheritLevel1Data extends BaseObjectData<InheritLevel1Data> { private String objectValue3; public InheritLevel1Data(String id, String d1, String d2, String d3) { super(id, d1, d2); this.objectValue3 = d3; } @Override public List<Difference> isSame(InheritLevel1Data otherObject) { List<Difference> differences = super.isSame(otherObject); if (otherObject != null && !getObjectValue3().equals(otherObject.getObjectValue3())) { differences.add(new Difference(getId(), getObjectValue3(), otherObject.getObjectValue3())); } return differences; } }
4. 修正后的测试类RunnerTest
调整列表类型为BaseObjectData<?>以兼容基类和子类实例,优化日志输出格式:
import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; public class RunnerTest { private static final Logger logger = Logger.getLogger("My logger"); public static void main(String[] args) { List<BaseObjectData<?>> objectDataList1 = buildList("id-1", "data-1", "data-2", "data-3b"); List<BaseObjectData<?>> objectDataList2 = buildList("id-1", "data-1", "data-2a", "data-3"); List<Difference> differences = new ArrayList<>(); for (BaseObjectData<?> o : objectDataList1) { BaseObjectData<?> o2 = (BaseObjectData<?>) o.findMatchingObject(objectDataList2); differences.addAll(o.isSame(o2)); } differences.forEach(v -> logger.info(String.format("差异ID: %s | 左值: %s | 右值: %s", v.id(), v.left(), v.right()))); } private static List<BaseObjectData<?>> buildList(String id, String data1, String data2, String data3) { return List.of( new BaseObjectData<>("BO_" + id, data1, data2), new InheritLevel1Data("ID1_" + id, data1, data2, data3) ); } }
期望输出
运行测试类后,日志会输出以下差异信息:
差异ID: BO_id-1 | 左值: data-2 | 右值: data-2a 差异ID: ID1_id-1 | 左值: data-2 | 右值: data-2a 差异ID: ID1_id-1 | 左值: data-3b | 右值: data-3
内容的提问来源于stack exchange,提问作者tm1701
相关产品推荐
相关产品推荐

