Java的整数List能存字符串对象吗

文章探讨了如何通过反射在List中添加String对象,解释了Java泛型的擦除机制,指出泛型主要在编译期起作用,防止运行时错误,减少强制类型转换。同时,讨论了泛型存在的意义,包括提前发现类型问题,减少ClassCastException,以及提高性能。
摘要由CSDN通过智能技术生成

背景

今天在写代码时,想到一个有趣的面试题,如题List能够存String对象吗?

粗看好像问了一个Java语法相关的知识点,其实我想考的是你对Java泛型的理解。

回答不能那么可以说对Java泛型几乎是没有理解,而仅仅回答出能,也是远远不够的。

在这里插入图片描述

一、怎么存?

首先来讲讲怎么存,话不多说,直接上代码,也不复杂大家都能看懂。

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class ListGeneric {
    private void genericTest() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        List<Integer> integerList = new ArrayList<>();
        integerList.add(1);
        Method method = integerList.getClass().getDeclaredMethod("add", Object.class);
        method.invoke(integerList, "String");
        System.out.println(integerList);
    }
}

我们通过反射来实现,最终打印输出的内容是[1, String],是不是有点匪夷所思。
当然这里需要提一点,直接通过add方法来添加"String"字符串对象,显然是不可行的。

或许回答不能的,这个结论应该从这里来,市面上的idea在编写时也都会报错。

二、为什么能存?

关键点来了,我所期望的是面试者能提出泛型擦除,与Java的泛型只在编译期生效。

简单整个笔试可能出现的面试题,或许又能加深的你印象。

接着问,以下两个方法能否定义在同一个类的成员方法中,

public List<Integer> func(List<Integer> list) {
    return List.of(1);
}

public List<String> func(List<String> list) {
    return List.of("String");
}

显然也是不能的,另外有一点我可能还会问一下,以上代码入参一致的话是不是方法的重载?
显然也不是,方法的重载不考虑返回值。

三、泛型存在的意义?

紧接着,又一个关键点来了,既然有擦除那么泛型存在的意义是?

1、泛型避免了代码在运行时才发现问题,例如上章节的例子。

2、如果都是使用Object基类替代,使用时需要强转,泛型减少了ClassCastException发生。

3、减少来自强制类型转换的性能消耗。

小结

每天一个小知识点,轻松带你了解真实的Java面试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全粘架构师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值