Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中使用泛型类型重载构造函数_Java_Constructor_Overloading - Fatal编程技术网

在java中使用泛型类型重载构造函数

在java中使用泛型类型重载构造函数,java,constructor,overloading,Java,Constructor,Overloading,代码如下: import java.util.ArrayList; import java.util.List; /** * Created by IDEA on 15/11/14. */ public class Matrix<T> { private final int nrow; private final int ncol; Matrix(List<List<T>> data) { nrow = data

代码如下:

import java.util.ArrayList;
import java.util.List;

/**
 * Created by IDEA on 15/11/14.
 */
public class Matrix<T> {
    private final int nrow;
    private final int ncol;

    Matrix(List<List<T>> data) {
        nrow = data.size();
        ncol = data.get(0).size();
    }

    Matrix(List<T[]> data) {
        nrow = data.size();
        ncol = data.get(0).length;
    }
}
import java.util.ArrayList;
导入java.util.List;
/**
*由IDEA于2014年11月15日创建。
*/
公共类矩阵{
私人终审法院;
私立国际文官;
矩阵(列表数据){
nrow=data.size();
ncol=data.get(0.size();
}
矩阵(列表数据){
nrow=data.size();
ncol=data.get(0).length;
}
}
IDE要求我删除第一个构造函数,为什么

IDE要求我重命名或删除第一个构造函数,为什么

这是因为泛型在Java中的工作方式。由于类型擦除,您实际上声明了两个构造函数,如下所示:

Matrix(List data)
这就是JVM看到的,添加了一些关于所涉及类型参数的元数据

这不仅仅适用于构造函数——您也不能重载基于泛型类型参数的方法

有关可怕的细节,请参阅

奇怪的是,构造函数只需要行和列计数,但这里有一个使用静态工厂方法的版本:

import java.util.ArrayList;
import java.util.List;

public class Matrix<T> {
    private final int nrow;
    private final int ncol;

    private Matrix(int nrow, int ncol) {
        this.nrow = nrow;
        this.ncol = ncol;
    }

    public static <T> Matrix<T> fromArrays(List<T[]> data) {
        return new Matrix<T>(data.size(), data.get(0).length);
    }

    public static <T> Matrix<T> fromLists(List<? extends List<T>> data) {
        return new Matrix<T>(data.size(), data.get(0).size());
    }
}
import java.util.ArrayList;
导入java.util.List;
公共类矩阵{
私人终审法院;
私立国际文官;
专用矩阵(int nrow,int ncol){
this.nrow=nrow;
this.ncol=ncol;
}
来自数组的公共静态矩阵(列表数据){
返回新矩阵(data.size(),data.get(0).length);
}

公共静态矩阵fromLists(List,因为两个构造函数具有相同的签名(相同数量的参数和相同的类型)。泛型类型不足以产生重载构造函数/方法,这是因为类型擦除


由于类型擦除,这两个构造函数都被视为矩阵(列表a)

如何“重命名”构造函数?在这种情况下,您有什么建议?需要基于泛型类型的重载,但不可用。@qed:您可以有两个名称不同的静态工厂方法,它们都调用同一个构造函数。在这种情况下,我可以一起跳过构造函数。您能详细介绍一下静态工厂方法的bi方法吗回答中的t?谢谢!@qed:你不明白哪一点?你有两个静态方法,每个方法都返回一个
矩阵
,但名称不同,因此它们不是重载。它们都调用同一个构造函数。
public class Test {
    public static void main(String[] args) {
        // We're only checking the compilation for the moment :)
        List<List<String>> lists = null;
        List<String[]> arrays = null;

        Matrix<String> x = Matrix.fromArrays(arrays);
        Matrix<String> y = Matrix.fromLists(lists);
    }
}