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
运算符需要特定类型。类型parametrT
是特定的非静态上下文。哪里有错误的推理?编译器如何知道类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.无论何时创建类的对象,编译器都会搜索适当的构造函数。如果没有找到,它将显示编译器错误。