其他
详解 Java 泛型,写得太好了!
点击“终码一生”,关注,置顶公众号
一直以来总有小伙伴问我,有没有全套完整的java学习课程, 针对这种情况,我们联合波波老师,原一线大厂在职架构师,耗时8个月联合打造了 《 2023年Java高薪课程 》已更新了 102G 视频,累计更新时长 500+ 个小时,需要的小伙伴可以了解下,一次购买,持续更新,无需2次付费。
泛型—— 一种可以接收数据类型的数据类型,本文将通俗讲解Java泛型的优点、方法及相关细节。
1
泛型的引入2
使用泛型的好处当不使用泛型时:
当使用泛型时:
class Person<E> {
E s; //可以是属性类型
public Person(E s) { //可以是参数类型
this.s = s;
}
public E f() { //可以是返回类型
return s;
}
public void show() {
System.out.println(s.getClass()); //显示S的运行类型
}
}
public static void main(String[] args) {
Person<String> person1 = new Person<String>("xxxx");// E->String
person.show();
Person<Integer> person2 = new Person<Integer>(123); // E->Integer
person.show();
}
运行结果:
class java.lang.String
class java.lang.Integer
3
泛型常见用法interface Im<U,R>{
void hi(R r);
void hello(R r1,R r2,U u1,U u2);
default R method(U u){
return null;
}
}
HashSet<Student> students = new HashSet<Student>();
students.add(new Student("懒羊羊",21));
students.add(new Student("喜羊羊",41));
students.add(new Student("美羊羊",13));
for (Student student :students) {
System.out.println(student);
}
HashMap<String, Student> hm = new HashMap<String, Student>();
// K-> String V->Student与下面的对应
hm.put("001",new Student("喜羊羊",21));
hm.put("002",new Student("懒羊羊",32));
hm.put("003",new Student("美羊羊",43));
Set<Map.Entry<String,Student>> ek=hm.entrySet();
Iterator<Map.Entry<String, Student>> iterator = ek.iterator();//取出迭代器
while (iterator.hasNext()) {
Map.Entry<String, Student> next = iterator.next();
System.out.println(next.getKey()+" - "+next.getValue());
}
我们都知道使用迭代器遍历HashMap时要先通过entrySet()取出键值对,然后通过转型得到对应的类来得到对象信息。而在使用泛型定义[K-V]就规定了取出的键值对的类型,所以就省去了转型这一步骤,同样也使程序变得简单,高效。
4
泛型使用细节P<A> ap = new P<A>(new A());
P<A> ap1 = new P<A>(new B()); //A的子类
class A {}
class B extends A{}
P<A> ap = new P(new A());
5
自定义泛型public static void main(String[] args) {
U<String, Double, Integer> u = new U<>();
u.hi("hello", 1.0); //X->String Y->Double
}
class U<X, Y, Z> {
public void hi(X x, Y y) {} //使用类声明的泛型
}
public static void main(String[] args) {
U<String, Double, Integer> u = new U<>();
u.m1("xx",22);
//当调用方法时,传入参数编译器会自己确定类型 会自动装箱
}
class U<X, Y, Z> {
public <X,Y> void m1(X x,Y y){} //自定义泛型方法
}
【福利】2023 高薪课程,全面来袭(视频+笔记+源码)
【福利】2023 高薪课程,全面来袭(视频+笔记+源码)
PS:防止找不到本篇文章,可以收藏点赞,方便翻阅查找哦。
往期推荐