Java之泛型简单使用

本篇文章只简单的解释如何将泛型用于方法及类。Let’s start!

Why we use
1.一旦使用泛型, 获取集合元素不再需要考虑类型强转了, 代码更加简洁。
2.在编译期就能发现问题。
3.让代码扩展性更强。

注:从1.7开始构造器后面不需要带完整的泛型信息。

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

我直接从Collectionscopy方法开始认识吧, 最后再解读该方法声明的含义。

 public static <T> void copy(List<? super T> dest, List<? extends T> src)

如何声明泛型方法

修饰符 <T, S>  返回值类型 方法名(形参列表){
 // 方法体
}

<T, S> 是类型形参, 它代表了使用方法的过程中实际传入的类型。 也不一定要使用T和S, 主要是一个习惯吧(T==>type)。类型形参以尖括号<>括起来, 多个类型形参以逗号分开, 类型形参放在修饰符和返回值之间。

// 来个栗子
static <T> void print(T t){
  System.out.println(t);
 }
// test
print("hi");
print(100);

输出:
hi
100

See? 这样你要打印String和int类型数据用一个方法就可以了。Now, 我们升级一下:

设定通配符的上限(extends)
// 第2个栗子
static <T> void forEachList(List<? extends T> list1, List<T> list2){
 }

? 表示通配符, 它表示匹配任何类型。List<? extends T> list1表示 ? 的类型必须是T类型或者它的子类, 那么T类型由谁决定呢? Yes, List<T> list2。解读下上面的方法参数:就是list1的类型必须与list2类型相同或者是它的子类

List<Integer> intList = new ArrayList<>();
List<Number> numList = new ArrayList<>();

forEachList(numList, intList); // 编译错误
forEachList(intList, numList); // ok

设定通配符的下限(super)

// 第3个栗子
static <T> void forEachList02(List<? super T> list1, List<T> list2){
}

? super T表示通配符 ? 是T类型或者T的父类

List<Integer> intList = new ArrayList<>();
List<Number> numList = new ArrayList<>();

forEachList02(numList, intList); // ok
forEachList02(intList, numList); // 编译错误   //对比下栗子3

Now, 我们再回来看copy方法

 public static <T> void copy(List<? super T> dest, List<? extends T> src)

该方法声明保证了无论如何src与dest是相同的类型 or src一定是dest的子类


如何声明一个普通泛型类?

来个例子说明吧。

// 最最简单的泛型类
class Fanxing<T>{
}

限制T的类型

// 第4个栗子
public  class Fanxing<T extends Integer> { // 使用extends关键字设定上限
                                           // 表明该类的类型只能是Integer或者它的子类
    T menber;

    public Fanxing(T menber){
        this.menber = menber;
    }

    public void printMember(){
        System.out.println(menber);
    }
}
public static void main(String[] args) {
 
 Fanxing<Integer> f = new Fanxing<>(555);
 f.printMember();

 Fanxing<Number> f1 = new Fanxing<>(666); // 编译报错
 f1.printMember();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值