首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Java不允许"new List <T>"?

Java不允许使用"new List<T>"的主要原因是因为Java中的泛型是在编译时期进行类型擦除的。在编译时,所有的泛型类型参数都会被擦除为它们的上界或者Object类型。

这意味着在运行时,Java无法确定泛型类型的具体参数,因此无法直接实例化一个泛型类型的对象。如果允许使用"new List<T>"这样的语法,编译器无法确定T的具体类型,也无法进行类型检查和类型推断。

为了解决这个问题,Java提供了泛型类型的实例化方式,即通过创建一个具体的子类或实现类来实例化泛型类型。例如,可以使用"new ArrayList<T>()"来实例化一个泛型ArrayList对象。

这种方式可以通过子类或实现类来确定泛型类型的具体参数,从而进行类型检查和类型推断。这样做的好处是可以在编译时期进行类型安全检查,避免在运行时出现类型错误。

总结起来,Java不允许"new List<T>"是因为泛型类型在编译时期进行类型擦除,无法确定具体的泛型参数,因此需要使用具体的子类或实现类来实例化泛型类型。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Kotlin入门潜修之类和对象篇—泛型及其原理

然而java不允许我们这么做,为什么? 假如java允许这么做,那么会带来什么后果?...错误,这句代码运行的时候会抛ClassCastException异常 } 这就是为什么java不允许我们这么做的原因,就是为了保证运行时类型安全。...那么java list中的addAll为什么可以呢? 让我们来看下list中的addAll方法的定义: boolean addAll(Collection<?...父类限制通配符允许添加其子类,而不允许添加其父类。 总结已经完毕,主要来看两个点: 1.为什么无限制通配符和子类限制通配符只有可读性没有可写性? 2.为什么父类限制通配符允许子类类型写入?...但是如果是T的超类那么是不允许像容器中添加元素的,因为我们无法确定T的超类具体是什么类型,取出来的时候就可能引起类型转换错误。代码示例如下: List<?

90430

Java泛型深入理解「建议收藏」

泛型相关问题 1、泛型类型引用传递问题 在Java中,像下面形式的引用传递是不允许的: ArrayList arrayList1=new ArrayList();//编译错误...所以为了避免这种极易出现的错误,Java不允许进行这样的引用传递。(这也是泛型出现的原因,就是为了解决类型转换的问题,我们不能违背它的初衷)。...这可能是Java泛型面试题中最简单的一个了,当然前提是你要知道Array事实上并不支持泛型,这也是为什么Joshua Bloch在Effective Java一书中建议使用List来代替Array,因为...因此,我们得出结论:不能往List 中添加任意对象,除了null。 那为什么List中加入Number的子类肯定是可以的。 非法使用 对List进行迭代是不允许的。为什么呢?

77420

泛型的基本原理

例如这样一个方法: ArrayList list = new ArrayList(); list.add(10); Integer num = list.get(0); //这是 ArrayList... 其中「限定类型变量名」可以是任意一个变量名称,你叫它 T 也好,E 也好,只要符合 Java 变量命名规范就可以。...所以子类数组实例赋值父类数组实例,只不过意味着父类数组实例的引用指向堆中子类数组而已,并不会有所冲突,因此是 Java 允许这种操作的。 而泛型是不允许这么做的,为什么呢?...但是,通配符往往用于方法的形参中,而不允许用于定义和调用语法中。例如下面的语句是不被支持的: ArrayList list = new ArrayList(); 当然了,除了 <?...细节与局限 通配符的只读性 考虑这样一段代码: ArrayList list = new ArrayList(); ArrayList<?

55500

Java中<? extends T>和<? super T>的理解

super T> 表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object; 上界首先你很容易误解它为继承于T的所有类的集合,你可能认为,你定义的这个List可以用来put任何T的子类,那么我们看下面的代码: import java.util.LinkedList...list为什么不能加入Father类和Father类的子类呢,我们来分析下。 List表示上限是Father,下面这样的赋值都是合法的 List<?...然后无论是想往里插入Son或者LeiFeng或者Father编译器都不知道能不能和这个CAP#1匹配,所以就都不允许。 所以通配符和类型参数的区别就在于,对编译器来说所有的T都代表同一种类型。...出于对类型安全的考虑,我们可以加入Father对象或者其任何子类(如Son)对象,但由于编译器并不知道List的内容究竟是Father的哪个超类,因此不允许加入特定的任何超类(如Human)。

1.1K10

Java

super T> 表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object; 上界首先你很容易误解它为继承于T的所有类的集合,你可能认为,你定义的这个List可以用来put任何T的子类,那么我们看下面的代码: import java.util.LinkedList...list为什么不能加入Father类和Father类的子类呢,我们来分析下。 List表示上限是Father,下面这样的赋值都是合法的 List<?...然后无论是想往里插入Son或者LeiFeng或者Father编译器都不知道能不能和这个CAP#1匹配,所以就都不允许。 所以通配符和类型参数的区别就在于,对编译器来说所有的T都代表同一种类型。...出于对类型安全的考虑,我们可以加入Father对象或者其任何子类(如Son)对象,但由于编译器并不知道List的内容究竟是Father的哪个超类,因此不允许加入特定的任何超类(如Human)。

1K30

带你深挖Java泛型类型擦除以及类型擦除带来的问题

为什么不能存别的类型呢?既然类型擦除了,如何保证我们只能使用泛型变量限定的类型呢? A: Java编译器是通过先检查代码中泛型的类型,然后在进行类型擦除,再进行编译。...在Java中,像下面形式的引用传递是不允许的: ArrayList list1 = new ArrayList(); //编译错误 ArrayList...所以为了避免这种极易出现的错误,Java不允许进行这样的引用传递。(这也是泛型出现的原因,就是为了解决类型转换的问题,我们不能违背它的初衷)。...所以java不允许这么干。再说,你如果又用list2往里面add()新的对象,那么到时候取得时候,我怎么知道我取出来的到底是String类型的,还是Object类型的呢?...为什么会这样呢?

3.8K21

带你深挖Java泛型类型擦除以及类型擦除带来的问题

为什么不能存别的类型呢?既然类型擦除了,如何保证我们只能使用泛型变量限定的类型呢? A: Java编译器是通过先检查代码中泛型的类型,然后在进行类型擦除,再进行编译。...在Java中,像下面形式的引用传递是不允许的: ArrayList list1 = new ArrayList(); //编译错误 ArrayList...所以为了避免这种极易出现的错误,Java不允许进行这样的引用传递。(这也是泛型出现的原因,就是为了解决类型转换的问题,我们不能违背它的初衷)。...所以java不允许这么干。再说,你如果又用list2往里面add()新的对象,那么到时候取得时候,我怎么知道我取出来的到底是String类型的,还是Object类型的呢?...为什么会这样呢?

1.6K40

JAVA回忆录之泛型篇

Apple的超类,编译器就会警告你: fruits.add(new Fruit()); fruits.add(new Object()); 因为我们不知道它是怎样的超类,所有这样的实例就不允许加入。...而从 JDK1.7开始new的泛型实例不用制定类型,编译期会默认与声明的对象用于相同的泛型类型。 擦除 前文中讲过泛型的擦除,为什么这里还需要再讲述呢?...不能实例化类型变量 不能以诸如“new T(...)", "new T[...]", "T.class"的形式使用类型变量。Java禁止我们这样做的原因很简单,编译期不知道创建那种类型的对象。...关于为什么有这样的规定,请考虑下面的代码: public class People { public static T name; public static T getName()...基于这个原因,Java不允许在泛型类的静态上下文中使用类型变量。 泛型在我们编码的过程中,特别是写一些框架或者通用组件时是非常有帮助的。 文章到这里就全部讲述完啦,若有其他需要交流的可以留言哦!!

50530
领券