Java范型

Java核心 专栏收录该内容
50 篇文章 0 订阅

范型 Generics

让数据类型变得参数化

  • 定义范型时,对应的数据类型是不确定的
  • 范型方法被调用时,会指定具体类型
  • 核心目标,解决容器类型在编译时安全检查的问题
public class GenericDemo {
    public static void main(String[] args) {
        List<String> linkedList = new LinkedList();
        linkedList.add("works");
//        linkedList.add(1);
        for (int i = 0; i < linkedList.size(); i++) {
            String item = (String) linkedList.get(i);
            System.out.println(item);
        }
    }
}

范型一般用作类型校验

  • 泛型类
  • 范型接口
  • 范型方法
class 类名称 <范型标识:可以随便写任意标识号,标识指定的范型的类型>{
	修饰符 范型标识/* ( 成员变量类型) */
	修饰符 构造函数(范型标识 参数)
	.......
} 
public class GenericDemo {
    public static void main(String[] args) {
        GenericClassExample<String> stringExample = new GenericClassExample<String>("abc");
        GenericClassExample<Integer> integerExample = new GenericClassExample<Integer>(123);
        System.out.println(stringExample.getMember().getClass());
        System.out.println(integerExample.getMember().getClass());
        System.out.println(integerExample.sayHello("haha"));
    }
}

@Data
public class GenericClassExample<T> {

    //member这个成员变量的类型为T,T的类型由外部指定
    private T member;
    public GenericClassExample(T member) {
        this.member = member;
    }

    public T handleSomething(T target){
        return target;
    }

    public String sayHello(String name){
        return "Hello" + name;
    }

}

泛型类

  • 范型的参数不支持基本类型
public class GenericDemo {
    public static void handleMember(GenericClassExample<Integer> integerGenericClassExample){
        Integer result = 111 + integerGenericClassExample.getMember();
        System.out.println("result is" + result);
    }
    public static void main(String[] args) {
        GenericClassExample<String> stringExample = new GenericClassExample<String>("abc");
        GenericClassExample<Integer> integerExample = new GenericClassExample<Integer>(123);
        System.out.println(stringExample.getClass());
        System.out.println(integerExample.getClass());
        handleMember(integerExample);
    }
}

@Data
public class GenericClassExample<T> {

    //member这个成员变量的类型为T,T的类型由外部指定
    private T member;
    public GenericClassExample(T member) {
        this.member = member;
    }

    public T handleSomething(T target){
        return target;
    }

    public String sayHello(String name){
        return "Hello" + name;
    }

}

能否在范型里面使用具备继承关系的类

  • 使用通配符?,但是会使得范型的类型检查失去意义
public class GenericDemo {
    public static void handleMember(GenericClassExample<?> integerGenericClassExample){
        Integer result = 111 + (Integer) integerGenericClassExample.getMember();
        System.out.println("result is" + result);
    }
    public static void main(String[] args) {
        GenericClassExample<String> stringExample = new GenericClassExample<String>("abc");
        GenericClassExample<Number> integerExample = new GenericClassExample<Number>(123);
        System.out.println(stringExample.getClass());
        System.out.println(integerExample.getClass());
        handleMember(integerExample);
    }
}
  • 给范型加入上边界 ?extends E
public class GenericDemo {
    public static void handleMember(GenericClassExample<? extends Number> integerGenericClassExample){
        Integer result = 111 + (Integer) integerGenericClassExample.getMember();
        System.out.println("result is" + result);
    }
    public static void main(String[] args) {
        GenericClassExample<String> stringExample = new GenericClassExample<String>("abc");
        GenericClassExample<Number> integerExample = new GenericClassExample<Number>(123);
        System.out.println(stringExample.getClass());
        System.out.println(integerExample.getClass());
        handleMember(integerExample);
    }
}

  • 给范型加入下边界 ?super E
public class GenericDemo {
    public static void handleMember(GenericClassExample<? super Integer> integerGenericClassExample){
        Integer result = 111 + (Integer) integerGenericClassExample.getMember();
        System.out.println("result is" + result);
    }
    public static void main(String[] args) {
        GenericClassExample<String> stringExample = new GenericClassExample<String>("abc");
        GenericClassExample<Number> integerExample = new GenericClassExample<Number>(123);
        System.out.println(stringExample.getClass());
        System.out.println(integerExample.getClass());
        handleMember(integerExample);
    }
}

范型接口

package com.imooc.demo.generic;

public interface GenericIFactory<T,N> {
    T nextObject();
    N nextNumber();
}

public class GenericFactoryImpl<T,N> implements GenericIFactory<T,N>{
    @Override
    public T nextObject() {
        return null;
    }

    @Override
    public N nextNumber() {
        return null;
    }
}

范型方法

public class GenericDemo {
    public static void handleMember(GenericClassExample<? super Integer> integerGenericClassExample){
        Integer result = 111 + (Integer) integerGenericClassExample.getMember();
        System.out.println("result is" + result);
    }
    public static void main(String[] args) {
        GenericClassExample<String> stringExample = new GenericClassExample<String>("abc");
        GenericClassExample<Number> integerExample = new GenericClassExample<Number>(123);
        System.out.println(stringExample.getClass());
        System.out.println(integerExample.getClass());
        handleMember(integerExample);
        Integer[] integers = {1,2,3,4,5,6};
        Double[] doubles = {1.1,1.2,1.3,1.4,1.5};
        Character[] characters = {'A','B','C'};
        stringExample.printArray(integers);
        stringExample.printArray(doubles);
        stringExample.printArray(characters);
    }
}

@Data
public class GenericClassExample<T> {

    //member这个成员变量的类型为T,T的类型由外部指定
    private T member;
    public GenericClassExample(T member) {
        this.member = member;
    }

    public T handleSomething(T target){
        return target;
    }

    public String sayHello(String name){
        return "Hello" + name;
    }

    public static <T> void printArray(T[] inputArray){
        for (T element : inputArray) {
            System.out.printf("%s", element);
            System.out.printf(" ");
        }
        System.out.println();
    }

}

范型字母的含义

  • E - Element:在集合中使用,因为集合中存放的是元素
  • T - Type:Java 类
  • K - Key:键
  • V - Value:值
  • N - Number:数值类型
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值