java泛型常问面试题总结

java泛型常见面试题总结:

1,Array中可以用泛型吗?

不能

2,你可以把List《String》传递给一个接受List《Object》参数的方法吗?

ArrayList《String》 arrayList1 = new ArrayList《Object》();
ArrayList《Object》 arrayList2 = new ArrayList,《String》();

很显然不能。例如以上写法是不正确的,虽然String继承自Object,但是ArrayList《String》和ArrayList《Object》是没有继承关系的。

3,java中List《Object》和原始类型List之间的区别?

问的更具体一点就是java中Set和Set《?》到底区别在哪儿?

Set是不受类型检测机制检查的,而Set《?》是受类型检测机制检查的。

例如下面代码:

public class SetDemo {
    public static void main(String[] args) {

        HashSet<Integer> s1 = new HashSet<>(Arrays.asList(1,2,3));
        printSet(s1);
    }

    public static void printSet(Set s) {
        s.add(10);    //这里不报错因为Set没有类型检查
        for (Object o : s) {
            System.out.println(o);
        }
    }

    public static void printSet1(Set<?> s) {
//        s.add(10);    //这里会报错,因为这里Set<?>会有类型检查
        for (Object o : s) {
            System.out.println(o);
        }
    }
}

4,java中List《?》和 List《Object》之间的区别是什么?

List《?》是一个未知类型的List,而 List《Object》其实是任意类型的List,你可以把 List《String》、 List《Integer》赋值给List《?》,却不能把List《String》赋值给 List《Object》。
因为虽然String继承自Object,但是 List《String》和 List《Object》没有半毛钱关系。
而 List《String》、 List《Integer》都可以认为是 List《?》的子类型。

5, List《String》和原始类型List之间的区别?

List《String》受类型检测机制检查,而List不受类型检测机制检查。

6,java中的泛型是什么?使用泛型的好处是什么?

泛型是一种参数化类型的机制,使用泛型有以下两种好处:
1,类型检测提前到编译期,便于更早发现错误。
2,代码复用。

 public void sort(int [] a) {  //这里只能添加int类型的数据

 }
 
   public <T> void sort1(T [] a) {  //这里改为泛型类型,int、double等等类型都可以用了,提高了代码的复用性

    }

注意:上面的int类型不能改为Object,虽然可以添加,但是不能比较数据的大小,因为Object不能比较类型。

7,java的泛型是如何工作的?什么是类型擦除?

java里面的泛型是一种伪泛型,只存在于java源码里面,在编译期时编译器会去检测泛型的类型,当我们把java代码编译成字节码后,泛型会退化,或者说是被擦除了。

java虚拟机不支持泛型,如果不擦除,虚拟机会认不出来。

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

限定通配符有两种·:
? extends XXX
? extends XXX

非限定通配符:

9,java泛型的PESC原则。List《? extends T》和List《? super T》之间有什么区别?

List《? extends T》,你可以把这个List当成是一个生产者,可以从里面拿东西但是不能从里面放东西。也就是PE 只读。

List《? super T》,可以把这个List当成一个消费者,你可以往里面存数据,但是不能往里面获取数据。也就是SC 只写。

10,如何编写一个泛型方法,让它能接受泛型参数并返回泛型类型?java中如何用泛型编写带有参数的类?

 //泛型方法
    public V put(K key, V value) {
        return cache.put(key,value);
    }
    
    //泛型类
    public class Pair<K,V> {
        private K key;
        private V value;
        
        public Pair(K key,V value) {
            
        }
    }

11,泛型类型变量不能是基本数据类型,只能是包装类型。

ArrayList《double》 arr1 = new ArrayList《》(); 错误
ArrayList《Double》 arr1 = new ArrayList《》(); 正确

12,运行时类型查询

ArrayList《String》 arr1 = new ArrayList《》();
if(arr1 instanceof ArrayList《String》) // 这是不行的,因为这里类型被擦除了
if(arr1 instanceof ArrayList《?》) // 这里是可以的,因为ArrayList《?》就是一种未知类型

13,泛型在静态类和静态方法中的问题

 public class Test<T> {
        // 这些都是错误的,因为你根本不知道这里的T是什么类型
        public static T one;
        public static T show(T one) {
            return null;
        }

        // 这里是可以的,因为<>里面的T和上面的Test<>中的T没有任何关系
        public static <T> T show1(T one) {
            return null;
        }
 }

14,如何阻止java中的类型未检查的警告?

这种警告可以使用@SuppressWarnings(“unchecked”)注解来屏蔽。

15,c++模板和java泛型之间有何不同?

c++里面是真正的泛型,而java里面是伪泛型。

在c++中,模板本质上就是一套宏指令集,只是换了个名头,编译器会针对每种类型创建一份模板代码的副本,由于架构上的差异,java泛型和c++模板有很多不同点:

c++可以使用int等基本数据类型,java则不行,必须转而使用Integer;
在java中可以将模板的参数类型限定为某种特定类型;
在c++中,类型参数可以实例化,而java不支持。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值