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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 21:09:53