Java范型的两种写法

本文介绍了Java中实现泛型的两种方式:一种是在方法级别上使用泛型,另一种是将泛型应用到整个类中。这两种方式都能有效提高代码的复用性和安全性。


1、原始的DAO层的类:

package  com.test;

public   class  UserDao  {
    
    
public   void  add(User user) {
        
// .保存实体的代码
    }

    
    
public  User get( int  id)  {
        
// .查询实体的代码
         return   null ;
    }


}

其中,User类代码比较简单,如下:

package  com.test;

public   class  User  {
    
    
private   int  id;
    
private  String name;
    
public   int  getId()  {
        
return  id;
    }

    
public   void  setId( int  id)  {
        
this .id  =  id;
    }

    
public  String getName()  {
        
return  name;
    }

    
public   void  setName(String name)  {
        
this .name  =  name;
    }

    
}


2、我们将Dao层的类写成范型的形式,有两种写法:
其一、

package  com.test;

public   class  EntityDao1  {
    
    
public   < T >   void  add(T t) {
        
// 查询实体的代码
    }

    
    
public   < T,ID >  T get(ID id) {
        
// .保存实体的代码
         return   null ;
    }


}

        范型一般用于方法的参数或者方法的返回值,上面的写法,我们要使范型有效,就须在方法的返回类型前加入强制范型转换。其中,add(T t)的参数用了范型,它的返回值是void型,就在void 前用强制类型转换,即加上<T>,强制转换成范型的形式,这样就不会报错了。而T get(ID id),由于它的参数和返回类型都用了范型,故要在返回类型T前强制转换,即<T,ID>。

其二,范型也可写成以下形式:

package  com.test;

public   class  EntityDao2 < T,ID >   {
    
    
public   void  add(T t) {
        
// ..保存实体的代码
    }

    
    
public  T get(ID id) {
        
// .查询实体的代码
         return   null ;
    }


}

这种形式,是把范型声明放在类中了,就不需每个方法都写强制类型转换。

看实际需要,哪种方法方便就用哪种吧!范型给Java编程带来了许多方便,好好利用,会达到事半功倍的效果。

### 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 泛型提供了一种安全而高效的方式来编写适用于各种数据类型的代码。无论是基本的泛型类还是复杂的泛型方法,都可以显著提升程序的质量和维护性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值