6.1java之泛型基本用法

什么是泛型:泛型就是编写模板代码来适应任意类型。
下面做个简单的例子:
java中一个ArrayList数组中能够存放object类型的数组,如果用其转存String类会有两个缺点:

  • 需要强转
  • 不方便易出错。
    Arraylist的代码
public class ArrayList {
//可以看到,在数组中存放的是Object类型,因此可以接收任意类型,但用String类型获取必须强转。
    private Object[] array;
    private int size;
    public void add(Object e) {...}
    public void remove(int index) {...}
    public Object get(int index) {...}
}

因此,我们可以这样重新创建一个StringArrayList

public class ArrayList {
    private String[] array;
    private int size;
    public void add(Object e) {...}
    public void remove(int index) {...}
    public Object get(int index) {...}
}

但这样又出现了局限性,因为java中类很多,而且还有个人创建的类,如果要为这些类分别创建一个这样的数组类,不能实现。
因此,泛型在这里有了用处:
我们可以使用泛型来创建String类型的list

ArrayList<String> strList = new ArrayList<String>();

测试:

strList.add("hello"); // OK
String s = strList.get(0); // OK
strList.add(new Integer(123)); // compile error!
Integer n = strList.get(0); // compile error!

可以将ArrayList<T>(用T来表示任意类型)看做是一个模版,我们可以在这模版上添加任何类型。

向上转型:使用ArrayList可以向上转型为List
因为ArrayList实现了List的接口

List<String> list = new ArrayList<String>();

但注意,泛型中ArrayList<Integer>、ArrayList<Number>不能随意转换,因为可能报错。
即T不能变。

使用泛型

如果创建的数组不进行泛型声明,则默认的类型为Object类型。

List list = new ArrayList();

泛型接口
除了在ArrayList<T>中使用泛型,也可以在自己编写的类中使用泛型。
例如:可以在Arrays中使用sort()方法对数组进行排序,排序的类型需实现Comparable<T>接口。

// sort
import java.util.Arrays;
//String类型排序按照首字母的先后顺序
public class Main {
    public static void main(String[] args) {
        String[] ss = new String[] { "Orange", "Apple", "Pear" };
        Arrays.sort(ss);
        System.out.println(Arrays.toString(ss));
	}
}
输出:[Apple, Orange, Pear]

因为String类已经继承了泛型接口:Comparable<T>
所以在自己定义的类中,若想使用泛型,该类徐先继承泛型接口。

编写泛型类

按照以下格式编写,一般编写较少

public class Pair<T> {
    private T first;
    private T last;
    public Pair(T first, T last) {
        this.first = first;
        this.last = last;
    }
    public T getFirst() {
        return first;
    }
    public T getLast() {
        return last;
    }
}
静态泛型方法:泛型不能用于静态方法
多个泛型类型:

定义:

public class Pair<T, K> {
    private T first;
    private K last;
    public Pair(T first, K last) {
        this.first = first;
        this.last = last;
    }
    public T getFirst() { ... }
    public K getLast() { ... }
}

使用:

Pair<String, Integer> p = new Pair<>("test", 123);//这里的new pair<>里可以不写,由编译器添加

例子:Map<key,value>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值