Java 泛型学习

本贴最后更新于 2927 天前,其中的信息可能已经物是人非

Java 泛型学习

在复习 Java 的时候,发现了对于泛型的了解还不是很好,所以今天特别画时间看了一下泛型方面的东西。

1. 泛型

泛型是 JDK1.5 版本之后引入的,其目的是为了让编程人员能够使用类型抽象。常见于集合中。
以下就是使用泛型的一个最典型例子:

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

上述代码的意思是,新建一个 ArrayList,并且通过泛型限制这个 list 中只能存放 Integer 类型的元素。其目的主要是为了防止在对集合操作时,各种类型不一样所导致的 java.lang.ClassCastException 的问题。

2. 泛型只在编译阶段有效

看以下代码

ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add("two"); // error
System.out.println(list);

在 Eclipse 中,第 3 行会有一个错误提示。
error
这个意思是,无法插入类型不一致的元素。
可是,使用 Java 的反射机制,可以绕过泛型验证。

list.getClass().getMethod("add", Object.class).invoke(list, "two");
System.out.println("list");

以上代码的运行结果为:
result
成功绕过。

3. 泛型类

参考以下代码

public class Class1 {

    public static void main(String[] args) {
        Box<String> b = new Box<>("123");
        System.out.println(b.getData());
    }

}


class Box<T> {
	
    private T data;
	
    public Box() {
		
    }
	
    public Box(T data) {
        this.data = data;
    }
	
    public T getData() {
        return data;
    }
	
    public void setData(T obj) {
        data = obj;
    }
	
}

这是使用泛型类的最简单情况。

4. 通配符

查看以下代码

public static void main(String[] args) {
    Box<Integer> b = new Box<>(1);
    System.out.println(b.getData());
    getData(b); // error
}
	
public static void getData(Box<Number> box) {
    System.out.println(box.getData());
}

在注释处,Eclipse 提示一个错误,大致意思是,类型不匹配,需要 Box<Number> 类型的参数。
为了满足我们 getData 方法的需求,我们必须对其参数进行修改。此时,我们使用类型通配符 ? 来进行修改操作。

public static void getData(Box<? extends Number> box) {
    System.out.println(box.getData());
}

进行这样的修改之后,编译通过。

同理,还有 <? supers Number> 这样的情况,这里就不多做赘述了。

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • zjhch123
    作者

    这都可以…

  • 其他回帖
  • someone

    [em14][em14][em14]基础知识薄弱啊!

  • Cherudim

    类型擦除,类加载的验证那步完成

  • 88250

    本文已经加入到社区优选,多谢贡献 :-)

    1 回复