我丢,去面试初级Java开发岗位,被问到泛型?,java面试问项目中遇到的问题怎么解决的

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

List intList2 = list;//你也可以把它赋给Integer类型的集合,但是当你把这个集合当成Integer的集合操作的时候,依旧会抛出ClassCastException异常

for (Integer i:intList2){//java.lang.ClassCastException

System.out.println(i);

}

3、泛型的定义和使用

=======================================================================

3.1 泛型类\泛型接口


泛型类、泛型接口就是把泛型定义在类或者接口上,在用户使用该类的时候才把类型明确下来。我们常用的集合,List,Map<K,V>,Stack……就是泛型类。在类上定义的泛型,在泛型类的方法、变量中都可以使用。

由于类型参数变量T在java泛型中仅仅是一个占位符,在传递参数之后才能使用,即在完成实例创建之后才能使用,所以在泛型类中,不能定义包含泛型类型的静态变量和静态方法,会报错cannot be referenced from a static context。泛型类中包含泛型类型的变量和方法必须在创建了实例明确了传递的类型参数后才可以使用。

class Myset{

private T value;

//public static T sval;//cannot be referenced from a static context

public static int sval2;

public Myset(){

}

public Myset(T val){

this.value = val;

}

public void setValue(T value) {

this.value = value;

}

public T getValue() {

return value;

}

/* public static T getSval(){//cannot be referenced from a static context

return sval;

}*/

}

Myset myset = new Myset<>();

myset.setValue(“12345”);

System.out.println(myset.getValue());//12345

myset = new Myset<>(“23”);

System.out.println(myset.getClass());//class liwx.learning.Myset

3.2 泛型方法


public static void PrintArray(T [] arr){

System.out.print(“[”);

for(T t:arr){

System.out.print(t+“,”);

}

System.out.println(“]”);

}

Integer[] a = {1,2,3,4,5,6,7};

PrintArray(a);//[1,2,3,4,5,6,7,]

3.3 泛型类的继承


泛型类的子类有两种继承方式

  • 子类不明确泛型类的参数变量,子类也是泛型类

  • 子类明确泛型类的参数变量,子类不是泛型类

//子类不明确泛型类的参数变量,子类也是泛型类

class MyChiSet1 extends Myset{

public MyChiSet1(){

}

public MyChiSet1(T val){

super(val);

}

}

//子类明确泛型类的参数变量,子类不是泛型类

class MyChiSet2 extends Myset{

public MyChiSet2(){

}

public MyChiSet2(String val){

super(val);

}

}

3.4 类型通配符?及其上下限


通配符<?>和类型参数变量的区别是什么?通配符<?>是实参而不是类型形参,而且List<?>在逻辑上是List,List等所有List<具体类型实参>的父类,它的使用比类型形参T更加灵活,但传入的通配符通常进行的是许多于具体类型无关的操作,如果涉及到具体类型相关的操作,以及返回值,还是需要使用泛型方法T。

当我们使用?号通配符的时候,只能调用与对象无关的方法,不能调用对象与类型有关的方法。因为直到外界使用才知道具体的类型是什么。

//虽然Object是所有类的基类,但是List在逻辑上与List等并没有继承关系,这个方法只能传入List类型的数据

public static void showOList(List list){

System.out.println(list.size());

}

//同理,这个方法只能传入List类型的数据,并不能传入List

public static void showList(List list){

System.out.println(list.size());

}//加入Java开发交流君样:756584822一起吹水聊天

//使用通配符,List<?>在逻辑上是所有List,List,List……的父类,可以传递所有List类型的数据,但是不能在List<?>类型的数据进行于具体类型相关的操作,如add

public static void showList2(List<?> list){

System.out.println(“<?>”);

System.out.println(list.size());

}

//设置通配符上限,可以传入List<Number及Number的子类>

public static void showNumList(List<? extends Number> list){

System.out.println(list.size());

}

//设置通配符上限,List<? super Number>只可以传入List<Number及其父类>

public static boolean Compare(List<? super Number> list1,List<? super Integer> list2){

return list1.size()>list2.size();

}

List Intgetlist = new ArrayList<>();

List Numberlist = new ArrayList<>();

//虽然Number是Integet的父类,但是传入List,它们逻辑上没有了继承关系

System.out.println(Intgetlist.getClass()==Numberlist.getClass());//true

​//加入Java开发交流君样:756584822一起吹水聊天

//showList(java.util.List<java.lang.Number>)

//List和List逻辑上无继承关系,所以无法调用

//showList(Intgetlist);//showList(java.util.List<java.lang.Number>)in FXtest cannot be applied to(java.util.List<java.lang.Integer>)

showList(Numberlist);

//public static void showList2(List<?> list)

//通配符List<?>在逻辑上是所有List<具体参数类型>的父类,方法可以传入其子类类型的数据

showList2(Intgetlist);

showList2(Numberlist);

// public static void showNumList(List<? extends Number> list)

//当设定了通配符上限,只能传入List<Number及其子类>的数据

List Stringlist = new ArrayList<>();

showNumList(Intgetlist);

showNumList(Numberlist);

//showNumList(Stringlist);

//showNumList(java.util.List<? extends java.lang.Number>)in FXtest cannot be applied to(java.util.List<java.lang.String>)

//public static boolean Compare(List<? super Number> list1,List<? super Integer> list2)

//当设定了通配符下限,List<? super Number>只能传入List<Number及其父类>的数据,不能传入子类Integer的List,

// 而List<? super Integer>则可以传入其父类Number的List

总结

阿里伤透我心,疯狂复习刷题,终于喜提offer 哈哈~好啦,不闲扯了

image

1、JAVA面试核心知识整理(PDF):包含JVMJAVA集合JAVA多线程并发,JAVA基础,Spring原理微服务,Netty与RPC,网络,日志,ZookeeperKafkaRabbitMQ,Hbase,MongoDB,Cassandra,设计模式负载均衡数据库一致性哈希JAVA算法数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算共30个章节。

image

2、Redis学习笔记及学习思维脑图

image

3、数据面试必备20题+数据库性能优化的21个最佳实践

image

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
图片转存中…(img-HWfwEUTO-1713470295564)]

3、数据面试必备20题+数据库性能优化的21个最佳实践

[外链图片转存中…(img-SHDGmLSL-1713470295564)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-2uNsSAi2-1713470295565)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值