首页 > 基础资料 博客日记
Java泛型
2023-09-03 22:37:54基础资料围观202次
文章Java泛型分享给大家,欢迎收藏Java资料网,专注分享技术知识
Java泛型
1.泛型概述
泛型的本质是为了参数化类型(即限制参数类型为我们指定泛型类型)
如这样:给list集合指定类型String
//比如给List集合指定一个泛型(String),那么存入List集合中的元素必须要是String类型
List<String> list= new ArrayList<String>();
2.泛型的优点
- 限制变量的类型,我们的类型是安全的(编译时的类型检测)
- 消除源码中的强制类型转换
3.泛型分类
(1)泛型类
当我们在类中操作的引入数据类型不确定时,可以根据需要自定义泛型支持的类
下面为一个定义泛型类的例子
//此处T可以写任意标识
//在实例化泛型类时,必须指定T的具体类型
public class Generic<T>{
//private 泛型标识 成员变量名
private T key;
public Generic(T key){
this.key=key;
}
public T set(){
return null ;
}
}
实例化泛型类
Generic<String> generic1 = new Generic<String>("Hello");
Generic<Integer> generic2 = new Generic<Integer>(123456);
(2)泛型接口
泛型接口与泛型类的定义与使用基本相同,下面为定义泛型接口和实现的例子
定义:
public interface Generic_interface<T,E> {
//T,E为我们指定的泛型类型,此处也是返回值和参数
public T set(T t);
public E get(E e);
}
实现:
- 实现泛型接口的类“没有”传入泛型实参
实例代码如下:
public class Generics<T,E> implements Generic_interface<T,E>{
@Override
public T set(T t) {
return null;
}
@Override
public E get(E e) {
return null;
}
}
- 实现泛型接口的类“有”传入泛型实参
实例代码如下:
public class Generics<String,Integer> implements Generic_interface<String,Integer>{
@Override
public String set(String string) {
return null;
}
@Override
public Integer get(Integer integer) {
return null;
}
}
(3)泛型方法
当我们只需关心某个方法时,我们可以直接定义泛型方法
定义与实现
public class Generics{
public static<T> void set(T[] t){
for(T element:t){
System.out.println(element);
}
}
public static void main(String[] args) {
Integer[] array={1,2,4};
String[] array1={"Java","C++"};
set(array);
set(array1);
}
}
4.泛型擦除
Java泛型是一种伪泛型,Java在编译期间,所有的泛型都会被擦除(类型擦除)
比如说把泛型T擦除为Object,T extends xxx擦除为限定类型xxx
例子:
List<Integer> list = new ArrayList<>();
list.add(12);
//1.编译期间直接添加会报错
//list.add("a");
Class<? extends List> clazz = list.getClass();
Method add = clazz.getDeclaredMethod("add", Object.class);
//2.运行期间通过反射添加,是可以的
add.invoke(list, "kl");
System.out.println(list)
5.泛型通配符
在泛型类和泛型方法中,类型一旦确定就不能更改,但在有些情况下,我们需要指定可以操作的类型为某个类的父类和子类。这时应使用泛型通配符
- 上界通配符
如“List<? extends Generics>”,其中的“?”代表Generics类和ta的子类
- 下界通配符
如“List<? super Generics>”,其中的“?”代表Generics类和ta的父类
- 无界通配符
如“List<? >”不加任何修饰,可以代表任意未知类型
文章来源:https://www.cnblogs.com/wery999/p/17675749.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: