欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【面试】泛型相关-这一篇全了解

程序员文章站 2022-03-13 12:06:36
...

什么是Java中的泛型。

解:

Java泛型(generics) 是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在使用时用具体的类型来替换。泛型最主要的应用是在JDK 5中的新集合类框架中。

泛型最大的好处是可以提高代码的复用性。以List接口为例,我们可以将String、Integer等类型放入List中,如不用泛型,存放String类型要写一个List接口,存放Integer要写另外一个List接口,泛型可以很好的解决这个问题。

什么是类型擦除。

解:

参考链接:Java的类型擦除-HollisChuang's Blog

什么是泛型中的限定通配符和非限定通配符 ?

解:

限定通配符对类型进行限制,泛型中有两种限定通配符:

一种是 <? extends T> 来保证泛型类型必须是 T 的子类来设定泛型类型的上边界;

另一种是 <? super T> 来保证泛型类型必须是 T 的父类来设定类型的下边界;

泛型类型必须用限定内的类型来进行初始化,否则会导致编译错误。非限定通配符 <?> 表示可以用任意泛型类型来替代,可以在某种意义上来说是泛型向上转型的语法格式,因为 List<String> 与 List<Object> 不存在继承关系。

Java泛型中K T V E ? object等分别代表什么含义。

解:

E – Element (在集合中使用,因为集合中存放的是元素)

T – Type(Java 类)

K – Key(键)

V – Value(值)

N – Number(数值类型)

? – 表示不确定的java类型(无限制通配符类型)

S、U、V – 2nd、3rd、4th types

Object – 是所有类的根类,任何类的对象都可以设置给该Object引用变量,使用的时候可能需要类型强制转换,但是用使用了泛型T、E等这些标识符后,在实际用之前类型就已经确定了,不需要再进行类型强制转换。

谈谈你对Java泛型中上下界限定符extends 和 super的理解

解:

<? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类

<? super T> 表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object

PECS原则 如果要从集合中读取类型T的数据,并且不能写入,可以使用 ? extends 通配符;(Producer Extends)

如果要从集合中写入类型T的数据,并且不需要读取,可以使用 ? super 通配符;(Consumer Super)

如果既要存又要取,那么就不要使用任何通配符。

可以把List<String>传递给一个接受List<Object>参数的方法吗?

答:不可以。
 

    public void inspect(List<Object> list) {

    for (Object obj : list) {

    System.out.println(obj);

    }

    list.add(1);//这个操作在当前方法的上下文是合法的。

    } 


    public void test() {

    List<String> strs = new ArrayList<String>();

    inspect(strs); //编译错误

    } 

这段代码中,inspect方法接受List<Object>作为参数,当在test方法中试图传入List<String>的时候,会出现编译错误。

假设这样的做法是允许的,那么在inspect方法就可以通过list.add(1)来向集合中添加一个数字。这样在test方法看来,其声明为List<String>的集合中却被添加了一个Integer类型的对象。这显然是违反类型安全的原则的,在某个时候肯定会抛出ClassCastException。

因此,编译器禁止这样的行为。编译器会尽可能的检查可能存在的类型安全问题。对于确定是违反相关原则的地方,会给出编译错误。当编译器无法判断类型的使用是否正确的时候,会给出警告信息。

Java中List<Object>和原始类型List之间的区别?

解:

原始类型List和带参数类型<Object>之间的主要区别是,在编译时编译器不会对原始类型进行类型安全检查,却会对带参数的类型进行检查。

通过使用Object作为类型,可以告知编译器该方法可以接受任何类型的对象,比如String或Integer。

它们之间的第二点区别是,你可以把任何带参数的类型传递给原始类型List,但却不能把List<String>传递给接受 List<Object>的方法,因为会产生编译错误。如第137期的题目。

Java中List<?>和List<Object>之间的区别是什么?

List<?> 是一个未知类型的List,而List<Object> 其实是任意类型的List。你可以把List<String>, List<Integer>赋值给List<?>,却不能把List<String>赋值给 List<Object>。

相关标签: 泛型