泛型类技术疑问:能否用任意类型T创建对象?泛型类仅指ArrayList吗?
关于泛型类的两个常见疑问解答
嘿,刚好最近也在跟同事聊泛型的基础问题,你的这两个疑问其实是入门泛型时很典型的点,我来给你掰扯清楚:
问题1:能否使用任意类型T创建泛型类的对象?
答案是大部分引用类型都可以,但有个关键例外——基本数据类型不行。
Java的泛型在编译后会做类型擦除,底层其实是用Object来存储数据的,而基本数据类型(比如int、char、double这些)不是对象,没法直接作为泛型参数。这时候得用对应的包装类:
- 错误示例:
ArrayList<int> numList = new ArrayList<>();(编译器会报错) - 正确示例:
ArrayList<Integer> numList = new ArrayList<>();
除此之外,任何引用类型都可以作为泛型参数,包括:
- Java自带的引用类型(
String、Date等) - 你自己定义的类(比如自定义的
User、Order类) - 甚至其他泛型类型(比如
ArrayList<ArrayList<String>>这种嵌套泛型)
问题2:泛型类特指ArrayList,还是可以是任意类型?
当然不是特指ArrayList!ArrayList只是Java标准库中最常用的泛型类实例而已,泛型类是一个通用的概念,你完全可以自己定义泛型类。
举个简单的自定义泛型类例子,比如一个通用的容器类:
public class GenericBox<T> { private T item; // 存入元素 public void putItem(T item) { this.item = item; } // 取出元素 public T getItem() { return this.item; } }
你可以用任意引用类型来实例化这个类:
GenericBox<String> stringBox = new GenericBox<>();(存字符串)GenericBox<Double> doubleBox = new GenericBox<>();(存浮点数)GenericBox<YourCustomClass> customBox = new GenericBox<>();(存自定义类对象)
标准库里还有很多其他泛型类,比如HashMap<K,V>、LinkedList<E>、HashSet<E>等等,本质上都是遵循泛型规则的类。
内容的提问来源于stack exchange,提问作者D-effery
相关产品推荐
相关产品推荐

