Java如何编写可同时接收Integer/Double二维ArrayList的自定义toString方法?
解决方案
你可以通过泛型方法实现需求,无需编写重复代码或额外转换,核心思路是限定泛型参数为Number的子类,这样就能同时兼容ArrayList<ArrayList<Integer>>和ArrayList<ArrayList<Double>>类型。
修改后的核心方法如下:
static <T extends Number> String matrixToString(ArrayList<ArrayList<T>> matrix) { ArrayList<String> s = new ArrayList<>(); for (int j = 0; j < matrix.get(0).size(); j++) { ArrayList<T> n = new ArrayList<>(); for (int i = 0; i < matrix.size(); i++) { n.add(matrix.get(i).get(j)); } s.add(myArrayListToString(n, ParseType.EMPTY_EMPTY_SPACE)); } return myArrayListToString(s, ParseType.EMPTY_EMPTY_NEWLINE); }
同时需要将myArrayListToString也修改为泛型方法,以支持任意Number子类的列表:
static <T extends Number> String myArrayListToString(ArrayList<T> list, ParseType type) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < list.size(); i++) { if (i > 0) { switch (type) { case EMPTY_EMPTY_SPACE: sb.append(" "); break; case EMPTY_EMPTY_NEWLINE: sb.append("\n"); break; } } sb.append(list.get(i).toString()); } return sb.toString(); }
原理说明
- 泛型参数
<T extends Number>限定方法仅接受Number及其子类类型,刚好匹配Integer和Double; - 调用方法时Java会自动推断具体的
T类型(传入Integer矩阵时T为Integer,传入Double矩阵时T为Double); - 内部创建的
ArrayList<T>可正常添加对应类型元素,避免了通配符? extends Number无法添加元素的问题。
内容的提问来源于stack exchange,提问作者Lapid Palid
相关产品推荐
相关产品推荐

