学习笔记:java的泛型

泛型

泛型,JDK1.5新加入的,解决数据类型的安全性问题,其主要原理是在类声明时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这样在类声明或实例化时只要指定好需要的具体的类型即可。
Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁、健壮。
• Java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段。
1.对象实例化时不指定泛型,默认为:Object。
2.泛型不同的引用不能相互赋值。

//定义一个泛型接口
interface Generator<T> {
T next();
}
  • 未传入泛型实参时,与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中
  • 即:class FruitGenerator implements Generator{
  • 如果不声明泛型,如:class FruitGenerator implements Generator,编译器会报错:“Unknown class”
 */
class FruitGenerator<T> implements Generator<T>{
    @Override
    public T next() {
        return null;
    }
}

/**
  • 传入泛型实参时:
  • 定义一个生产器实现这个接口,虽然我们只创建了一个泛型接口Generator
  • 但是我们可以为T传入无数个实参,形成无数种类型的Generator接口。
  • 在实现类实现泛型接口时,如已将泛型类型传入实参类型,则所有使用泛型的地方都要替换成传入的实参类型
  • 即:Generator,public T next();中的的T都要替换成传入的String类型。
 */
class FruitGenerator implements Generator<String> {
@Override
public String next() {
// TODO Auto-generated method stub
return null;
}
}

泛型方法 方法,也可以被泛型化,不管此时定义在其中的类是不是泛型化的。在泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据的类型。
泛型方法的格式:

 public class DAO {
	public <E>  void show(E e){
		System.out.println(e.toString());
	}
	public <T> T show1(T t){
        		return t;
    	}
  }

/**
 * 泛型方法与可变参数
 * @param args
 */
public <T> void printMsg( T... args){
    for(T t : args){
       System.out.println("泛型测试 ,t is " + t);
    }
}
/**
 * 静态方法无法访问类上定义的泛型;
 * 如果静态方法操作的引用数据类型不确定的时候,必须要将泛型定义在方法上
 * @author lby
 * @param <T>
 */
class StaticGenerator<T> {
    /**
     * 如果在类中定义使用泛型的静态方法,需要添加额外的泛型声明(将这个方法定义成泛型方法)
     * 即使静态方法要使用泛型类中已经声明过的泛型也不可以。
     * 如:public static void show(T t){..},此时编译器会提示错误信息:
          "StaticGenerator cannot be refrenced from static context"
     */
    public static <T> void show(T t){
    }
}

通配符

/**
 * 不确定集合中的元素具体的数据类型
 * 使用?表示所有类型
 * @param list
 */
public void test(List<?> list){
System.out.println(list);
}

举例:

<? extends Person> (无穷小 , Person]只允许泛型为Person及Person子类的引用调用 <? super Person > [Person , 无穷大)只允许泛型为Person及Person父类的引用调用 <? extends Comparable> 只允许泛型为实 现Comparable接口的实现类的引用调用
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面我将为你介绍如何在 Java 中建立泛型类及泛型方法,并进行调用。 首先,让我们看一下如何建立泛型类。泛型类是指具有一个或多个类型参数的类。我们可以使用类型参数来代替具体的数据类型,从而使类更通用、更灵活。例如,下面是一个简单的泛型类示例: ```java public class Pair<T1, T2> { private T1 first; private T2 second; public Pair(T1 first, T2 second) { this.first = first; this.second = second; } public T1 getFirst() { return first; } public T2 getSecond() { return second; } } ``` 在上面的示例中,我们定义了一个 `Pair` 类,该类有两个类型参数 `T1` 和 `T2`。我们可以使用这个类来表示一对值,其中一个值的类型是 `T1`,另一个值的类型是 `T2`。 接下来,让我们看一下如何建立泛型方法。泛型方法是指具有一个或多个类型参数的方法。我们可以使用类型参数来代替具体的数据类型,从而使方法更通用、更灵活。例如,下面是一个简单的泛型方法示例: ```java public class Utils { public static <T> void printArray(T[] array) { for (T element : array) { System.out.print(element + " "); } System.out.println(); } } ``` 在上面的示例中,我们定义了一个 `printArray` 方法,该方法有一个类型参数 `T`。我们可以使用这个方法来打印任何类型的数组。 现在,我们来看一下如何调用泛型类和泛型方法。对于泛型类,我们需要在创建对象时指定类型参数。例如: ```java Pair<Integer, String> p1 = new Pair<>(1, "hello"); Pair<Double, Double> p2 = new Pair<>(3.14, 2.71); ``` 在上面的示例中,我们创建了两个 `Pair` 对象,一个用于存储一个 `Integer` 和一个 `String`,另一个用于存储两个 `Double`。 对于泛型方法,我们需要在调用方法时指定类型参数。例如: ```java Integer[] arr1 = {1, 2, 3, 4, 5}; String[] arr2 = {"hello", "world"}; Utils.printArray(arr1); // 输出:1 2 3 4 5 Utils.printArray(arr2); // 输出:hello world ``` 在上面的示例中,我们调用了 `printArray` 方法,并传递了两个不同类型的数组作为参数。由于该方法是泛型方法,因此编译器会根据传递的参数类型自动推断出类型参数 `T` 的具体类型。 希望这个示例能够帮到你,祝你学习愉快!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值