Java中范型的作用

在JDK1.5之后引入了 范型的概念,到底什么事范型的,在一段时间内 我也是很模糊 。。。。

下面我用一个 ArrayList 来演示范型的作用 。

我们知道ArrayList 可以看做是一个线性表 , 我们在为进行范型规范化的时候,这个线性表中可以存储的原始类型 可以是各种各样的类型 ,这就说明一个表中 存储了不同类型的数据 。 这样做很不安全,而且容易出错 。

看下面一段代码,JAVA5以前的版本

ArrayLsit col=new ArrayList() ;

col.add(1) ;

col.add("string") ;

col.add(false) ;

......

看到上面一个ArrayList中存储各种各样的 类型的元素

JDK1.5进行范型规范后Generic

ArrayList <Integer> col=new ArrayList() ;

col.add(1) ;//可以

col.add("string") ; //会报错,因为进行了范型规范之后 这个线性表中只能存储 Integer类型的数据 ,

这样做就很好的保证了集合类型的唯一性、。。。。。

以上只是范型的简单应用,范型在反射中也应用到了 。看下面一段代码

Constructor con=String.class.getConstructor(StringBuffer.class) ;
String str=(String) con.newInstance(new StringBuffer("xiaowei")); //注意 这里我们对于String的构造方法映射类 创建的对象需要强制转换
System.out.println(str);

但是进行了范型规范之后就不需要了 ,这就是范型的作用 。

Constructor<String> con=String.class.getConstructor(StringBuffer.class) ;
String str=con.newInstance(new StringBuffer("xiaowei"));
System.out.println(str);

范型是给编译器看的,在编译字节码文件之后 就会去类型化

### Java 泛型使用方法详解 Java 泛型是一种强大的编程特性,用于增强代码的安全性和灵活性。它允许开发者在编译阶段捕获类型错误,从而减少运行时异常的发生。以下是关于 Java 泛型的一些核心概念和用法: #### 1. 基本语法 泛型的核心思想是在定义类、接口或方法时引入一个或多个类型参数。这些参数可以用作字段、返回值或形参的占位符。 ```java public class Box<T> { private T content; public void setContent(T content) { this.content = content; } public T getContent() { return content; } } ``` 这段代码展示了如何创建一个简单的泛型类 `Box`,其中 `<T>` 表示任意类型[^1]。 --- #### 2. 静态方法与泛型 由于静态方法属于类本身而非实例,因此它们无法访问类级别的泛型类型参数。然而,可以通过将静态方法声明为泛型方法来解决这一限制。 ```java public class Util { public static <T> T getFirstElement(T[] array) { if (array == null || array.length == 0) { throw new IllegalArgumentException("Array is either null or empty"); } return array[0]; } } ``` 此示例展示了一个通用的静态方法 `getFirstElement`,它可以接受任何类型的数组并返回第一个元素[^2]。 --- #### 3. 方法级泛型 除了类级别的泛型外,还可以单独为某个方法定义类型参数。这种方法称为 **泛型方法**。 ```java public class MyArrayList { // 定义一个静态泛型方法 public static <E> void addAll(ArrayList<E> list, E... elements) { Collections.addAll(list, elements); } public static void main(String[] args) { ArrayList<String> stringList = new ArrayList<>(); addAll(stringList, "Apple", "Banana", "Cherry"); System.out.println(stringList); // 输出: [Apple, Banana, Cherry] } } ``` 这里演示了如何在一个工具类中定义泛型方法,并通过可变参数支持动态传入多个同类型数据[^3]。 --- #### 4. 多重类型参数 某些情况下可能需要处理多种不同类型的组合,此时可以在泛型定义中指定多个类型变量。 ```java public class Animal<T, U> { private String name; private T mouth; private U eyes; public Animal(String name, T mouth, U eyes) { this.name = name; this.mouth = mouth; this.eyes = eyes; } @Override public String toString() { return "Animal{name='" + name + "', mouth=" + mouth + ", eyes=" + eyes + "}"; } } // 测试多重泛型 public class Test { public static void main(String[] args) { Animal<String, Integer> dog = new Animal<>("Dog", "Bark", 2); System.out.println(dog); // 输出: Animal{name='Dog', mouth=Bark, eyes=2} } } ``` 上述例子说明了如何在同一类中同时管理两种不同的类型参数[^4]。 --- #### 5. 泛型上下限约束 为了进一步控制泛型的实际类型范围,可以使用通配符(`?`)以及上下界限定词(`extends` 或 `super`),这有助于提高代码的复用性。 - 上限:`<? extends UpperBoundType>` - 下限:`<? super LowerBoundType>` ```java class Fruit {} class Apple extends Fruit {} public class Info<T> { private T data; public Info(T data) { this.data = data; } public T getData() { return data; } } public class Main { public static void upperLimit(Info<? extends Fruit> info) { System.out.println(info.getData()); } public static void lowerLimit(Info<? super Apple> info) { System.out.println(info.getData()); } public static void main(String[] args) { Info<Fruit> fruitInfo = new Info<>(new Fruit()); Info<Apple> appleInfo = new Info<>(new Apple()); upperLimit(fruitInfo); // 合法 upperLimit(appleInfo); // 合法 lowerLimit(fruitInfo); // 不合法 lowerLimit(appleInfo); // 合法 } } ``` 以上代码片段解释了如何利用上限和下限机制实现更灵活的泛型设计[^5]。 --- ### 总结 Java 泛型提供了一种安全而高效的方式来编写适用于各种数据类型的代码。无论是基本的泛型类还是复杂的泛型方法,都可以显著提升程序的质量和维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值