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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w372426096/article/details/84616367

什么是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>。

猜你喜欢

转载自blog.csdn.net/w372426096/article/details/84616367