「java泛型通配符接口」泛型通配符的上限语法
本篇文章给大家谈谈java泛型通配符接口,以及泛型通配符的上限语法对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、Java里的泛型加通配符的用法
- 2、java中什么是泛型,怎么用泛型?
- 3、java里的泛型和通配符
- 4、java泛型与通配符
- 5、求助:关于Java泛型通配符
- 6、请问java泛型中通配符的形式不包括以下哪一种
Java里的泛型加通配符的用法
感觉是有点问题,像是设计上的问题。
People p=new People();
List? extends User list=new ArrayListPeople();
list.add(p);
像你这个代码,如果list.add(p);加的不是一个People,那会怎么样呢?假设另一个类Man继承于User,且Man与People没从属关系。那么然后按照List? extends User list来理解,将Man加到list里面应该是没问题的吧。可是另一方面我们定义的list是一个new ArrayListUser(),这样看的话把Man加到list里面貌似就呃掉了吧。
而按照freish的说法也是不那么对的样子。因为如果存在这么一个函数f(List? extends Number LN),在这里函数里,我们限制了输入的参数LN必须只能存放数字类Number,这样一个限制应该是很有用的吧,可以避免你把一个ListString或者其他东西传给函数f()。如果按照freish的方法,我们把? extends Number直接写为Number的话,那么你f(new ArrayListInteger())这样写的话编译器会华丽丽的报错,所以这么改又是不对的。
在你这个问题里面的话,把list写出 List? extends User list 是没什么实际意义的,但是如果像是在上面函数f(List? extends Number LN)里的话确是有意义了。也就是说理论上来说,通配符是被设计成一个有用的东西的,也就是用来限定传入函数的参数的(或者赋值时来限定等号右边的)。而通过通配符来限定是某某某的子类或者超类在list这种容器应用的时候却产生了矛盾,也就是上面说的你本来只是想把People给加到list的,结果却一不小心把人家Man给加进来了。这样看来的话,java应该是考虑到这种情况了,所以就? extends User 成什么乱七八糟的 capture#105 of ? extends User类型了。泛型产生的原因就是当时的list这些容器能把任何类型的东西存进去又再拿出来(因为是Object),这样容易产生混乱。所以就产生了泛型来限制和检查类型。而这种限制却在这些特殊的情况下面产生了矛盾。
嗯,所以总结来说,你不能这么写代码,不能把要操作到泛型参数的方法的类声明为带有通配符的模式。还有一些例子看起来好似能通过编译的,实际确是不行的。比如说
class PeopleK,V extends User{
void f(K k){System.out.println("f(K k)");}
void f(V v){System.out.println("f(V v)");}
}
在这里f有着两个不同类型参数K和V,看起来好像没事儿的样子。但是这是不能编译成功的。因为如果K是String而V也是String的时候,那么两个函数不就冲突了么?
java中什么是泛型,怎么用泛型?
这是在各种Java泛型面试中,一开场你就会被问到的问题中的一个,主要集中在初级和中级面试中:
1:什么是泛型?
泛型就是广泛的类型,也是一种数据类型,而这种数据类型可以是任意类型,编写过程中当中不能确定类型,创建对象时必须指定具体类型,不指定也可以,但是会出现一些错误。
泛型是编译器行为,只能在编译期有效,如果能够跨过编译器,那么泛型就没有任何意义了。
2、泛型类
怎么定义泛型类?
在类后面加,中可以编写任意长度任意字符,不能是数值。(一般用26个大写英文字母表示)
泛型类 具体类型 变量名 = new 泛型类();
3.怎么使用泛型
有以下几种使用场景以及放在那种位置
泛型只能定义引用数据类型,而不能使用基本数据类型
泛型类、泛型方法、泛型接口、泛型通配符
例如:作用在类上时( public class Animal E { E pet; } ) , 泛型跟在类后边,可以指定用了泛型的类内部的 pet 的类型。
作用在对象上时( AnimalDog str = new AnimalDog(); ) , 泛型跟在类后边 , 使得对象类的的 pet 属性为 Dog类型。
java里的泛型和通配符
解释这样的,希望可以被采纳为答案:
1.先解释最中间的括号:某一个对象A继承了K这个类,某一个对象B继承V这个类
2. Map.Entry是map中的一个方法,该方法可以返回一个对象的集合,那么现在得这个集合就是,A,B所组成的集合
3.iterator迭代器类似于for循环,将A,B这个集合迭代出来,取出A,B单独的对象
希望我的回答你满意。
java泛型与通配符
写E的是模板
而?是一种实例化,是不确定类型的实例化,直接写?,等同于? extends Object
boolean
removeAll(Collection? c),是说,从自身(ArrayList)中移除,任意类型的集合的所有元素。
比如可以是CollectionString,也可以是其他。
而换成E,就被限定了。
原因是ArrayListE是个模板类,使用的时候总要实例化,比如实例化为
ArrayListString list;
那么这个removeAll参数的类型也被实例化成CollectionE,这样是违背了设计的初衷了。
求助:关于Java泛型通配符
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。Java语言引入泛型的好处是安全简单。
在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率
请问java泛型中通配符的形式不包括以下哪一种
Java泛型中的通配符不包括“? extends X”,这个形式是不被支持的。
Java泛型中的通配符支持的形式有: ?,? super X,? extends X。
“?”表示任何类型的通配符,它可以用于类型参数的声明中,表示接受任何类型的参数,但是无法保证该参数的类型安全性,也就是说,在使用该参数时,无法保证程序不会抛出异常。
“? super X”表示可以接受X类型及其X类型的父类类型的参数,它可以保证类型安全性,而且被称为上界通配符,它的作用就是只能接受X类型及其父类类型的参数,无法接受X类型的子类类型的参数。
“? extends X”表示可以接受X类型及其X类型的子类类型的参数,它可以保证类型安全性,而且被称为下界通配符,它的作用就是只能接受X类型及其子类类型的参数,无法接受X类型的父类类型的参数。
因此,Java泛型中的通配符不包括“? extends X”,其他三种形式都是受支持的。
关于java泛型通配符接口和泛型通配符的上限语法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。