Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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_Generics_Instance_Type Parameter - Fatal编程技术网

Java 泛型类和非静态方法

Java 泛型类和非静态方法,java,generics,instance,type-parameter,Java,Generics,Instance,Type Parameter,我们有以下代码: class MyClass<T>{ public void method(){ List<T>= new ArrayList<T>(); } } 我们有一个编译错误。我知道我们可以应用抽象工厂模式或使用反射来满足这一需求。但是new运算符需要特定类型。类型parametrT是特定的非静态上下文。哪里有错误的推理?编译器如何知道类T(在运行时不存在)将有一个没有参数的构造函数?由于没有办法保证这一点,显然这是不

我们有以下代码:

class MyClass<T>{
    public void method(){
        List<T>= new ArrayList<T>();
    }
}

我们有一个编译错误。我知道我们可以应用抽象工厂模式或使用反射来满足这一需求。但是
new
运算符需要特定类型。类型parametr
T
是特定的非静态上下文。哪里有错误的推理?

编译器如何知道类T(在运行时不存在)将有一个没有参数的构造函数?由于没有办法保证这一点,显然这是不允许的

编译器如何知道类T(在运行时不存在)将有一个没有参数的构造函数?由于没有办法保证这一点,显然这是不允许的

据我所知,编译器在非静态上下文中标记类型参数,因此我们可以实例化ArrayList

不知道。即使在非静态上下文中,编译器也不知道
t
表示什么类型。
新建ArrayList()的原因可以工作,编译器知道
ArrayList
有一个0-arg构造函数。类型参数
T
将被实际类型参数替换。它可以是任何类型。由于您可以创建任何类型的
ArrayList
,这很好

但新运算符需要特定的类型。类型参数是特定于非静态上下文的。我哪里有错误的推理

在<代码>新T()的情况下t
是什么类型,因此它不知道是否存在任何可访问的
t
的0-arg构造函数。考虑下面的一个类:

class Test {
    private int value;
    public Test(int value) { this.value = value; }
}
然后将泛型类实例化为:

MyClass<Test> obj = new MyClass<Test>();
MyClass obj=newmyclass();
现在,假设编译器允许
newt(),那么对于这个实例化,它就像执行-
newtest()。但是
测试中没有0-arg构造函数。那么,您希望代码在运行时表现如何?它肯定会抛出异常。这是编译器通过显示编译器错误来防止的

我们可以通过指定一个绑定的-
T扩展数来向类型参数
T
添加更多信息。但这只允许我们访问parameter类型的方法。构造函数仍然无法访问

据我所知,编译器在非静态上下文中标记类型参数,因此我们可以实例化ArrayList

不知道。即使在非静态上下文中,编译器也不知道
t
表示什么类型。
新建ArrayList()的原因可以工作,编译器知道
ArrayList
有一个0-arg构造函数。类型参数
T
将被实际类型参数替换。它可以是任何类型。由于您可以创建任何类型的
ArrayList
,这很好

但新运算符需要特定的类型。类型参数是特定于非静态上下文的。我哪里有错误的推理

在<代码>新T()的情况下t
是什么类型,因此它不知道是否存在任何可访问的
t
的0-arg构造函数。考虑下面的一个类:

class Test {
    private int value;
    public Test(int value) { this.value = value; }
}
然后将泛型类实例化为:

MyClass<Test> obj = new MyClass<Test>();
MyClass obj=newmyclass();
现在,假设编译器允许
newt(),那么对于这个实例化,它就像执行-
newtest()。但是
测试中没有0-arg构造函数。那么,您希望代码在运行时表现如何?它肯定会抛出异常。这是编译器通过显示编译器错误来防止的


我们可以通过指定一个绑定的-
T扩展数来向类型参数
T
添加更多信息。但这只允许我们访问parameter类型的方法。构造函数仍然无法访问。

您如何保证有无参数构造函数?您如何保证有无参数构造函数?哦!谢谢你详尽的回答!但是我有以下两个问题:1.让我们不显式地定义构造函数。在这种情况下,我们是否有一个空的默认0参数构造函数?2.当我们调用
new
运算符编译器时,检查是否存在具有给定参数的构造函数?@St.Antario。1.是的,在这种情况下,编译器会添加一个默认的0-arg构造函数,但问题不是这样。编译器在编译时无法知道
T
的类型。所以,它不允许这样的使用。2.无论何时创建类的对象,编译器都会搜索适当的构造函数。如果没有找到,它会显示编译器错误。哦!谢谢你详尽的回答!但是我有以下两个问题:1.让我们不显式地定义构造函数。在这种情况下,我们是否有一个空的默认0参数构造函数?2.当我们调用
new
运算符编译器时,检查是否存在具有给定参数的构造函数?@St.Antario。1.是的,在这种情况下,编译器会添加一个默认的0-arg构造函数,但问题不是这样。编译器在编译时无法知道
T
的类型。所以,它不允许这样的使用。2.无论何时创建类的对象,编译器都会搜索适当的构造函数。如果没有找到,它将显示编译器错误。