Java泛型Matrix二维数组初始化出现int转Matrix类型不匹配错误如何解决
报错原因
你声明的是Matrix<Integer>类型的二维数组,数组每个位置的元素都要求是Matrix<Integer>类的实例,你直接填入int值,编译器自然会报类型不匹配错误。
正确初始化方案
方案1:直接封装元素初始化泛型数组
首先确保你的Matrix类支持传入整型参数构造实例(比如有Matrix(Integer val)这类构造方法),将每个int值封装为Matrix<Integer>对象后再填入数组即可:
@SuppressWarnings("unchecked") Matrix<Integer>[][] m = (Matrix<Integer>[][]) new Matrix[][] { {new Matrix<>(2), new Matrix<>(34), new Matrix<>(532), new Matrix<>(12)}, {new Matrix<>(923), new Matrix<>(6), new Matrix<>(0), new Matrix<>(67)}, {new Matrix<>(32), new Matrix<>(324), new Matrix<>(3), new Matrix<>(13)} };
这个方案和你原来的写法逻辑一致,仅补充了元素的封装步骤,由于Java泛型的类型擦除特性,这里需要保留@SuppressWarnings("unchecked")注解压制编译警告。
方案2:用嵌套集合替代泛型数组(更安全)
Java并不推荐直接使用泛型数组,你可以用嵌套的List集合实现相同的3×4结构,不需要强制类型转换也不需要压制编译警告:
// 不可变集合写法,Java 9+支持 List<List<Matrix<Integer>>> matrixList = List.of( List.of(new Matrix<>(2), new Matrix<>(34), new Matrix<>(532), new Matrix<>(12)), List.of(new Matrix<>(923), new Matrix<>(6), new Matrix<>(0), new Matrix<>(67)), List.of(new Matrix<>(32), new Matrix<>(324), new Matrix<>(3), new Matrix<>(13)) ); // 可变集合写法,兼容所有Java版本 List<List<Matrix<Integer>>> mutableMatrix = new ArrayList<>(); mutableMatrix.add(Arrays.asList(new Matrix<>(2), new Matrix<>(34), new Matrix<>(532), new Matrix<>(12))); mutableMatrix.add(Arrays.asList(new Matrix<>(923), new Matrix<>(6), new Matrix<>(0), new Matrix<>(67))); mutableMatrix.add(Arrays.asList(new Matrix<>(32), new Matrix<>(324), new Matrix<>(3), new Matrix<>(13)));
如果你的Matrix类有对应的静态工厂方法构造实例,将代码中的new Matrix<>(xxx)替换为对应工厂方法调用即可。
内容的提问来源于stack exchange,提问作者user15991497
相关产品推荐
相关产品推荐

