编译时检查非法的类型数据结构,本质就是参数化类型,也就是所操作的数据类型被指定为类型数据结构.
泛型类,如果没有指定具体的数据类型,此时,操作类型是Ob;ject
泛型类型在逻辑上可以看成是多个不同的类型,但实际上都是相同类型
public static void main(String[] args) {
Generic<String> strGeneric=new Generic<>("a");
String key1 = strGeneric.getKey();
Generic<Integer> integerGeneric=new Generic<>(123);
Integer key2 = integerGeneric.getKey();
//不指定泛型,默认为Object类型,int 不是继承自Object所以不能作为限定类型
Generic generic=new Generic("ABC");
Object key3 = generic.getKey();
//Generic<int> generic1=new Generic<int>(100);
//同一泛型类,根据不同的数据类型创建的对象,本质上是同一类型
System.out.println(strGeneric.getClass());
System.out.println(integerGeneric.getClass());
System.out.println(strGeneric.getClass()==integerGeneric.getClass());
public class ProductGetter<T> {
ArrayList<T> list=new ArrayList<>();
product=list.get(random.nextInt(list.size()));
public static void main(String[] args) {
ProductGetter<String> stringProductGetter=new ProductGetter<>();
String[] strProduct={"苹果手机","华为手机","扫他机器人","咖啡机"};
for (int i=0;i<strProduct.length;i++){
stringProductGetter.addProduct(strProduct[i]);
String product = stringProductGetter.getProduct();
System.out.println("恭喜您抽中了:"+product);
class ChildGeneric<T> extends Generic<T>
class ChildGeneric extends Generic<String>
public void setValue(E value) {
public class ChildFirst<T,E,K> extends Parent<T>{
public class ChildSecond extends Parent<Integer>{
public void setValue(Integer value) {
public static void main(String[] args) {
ChildFirst<String> childFirst=new ChildFirst<>();
String value = childFirst.getValue();
ChildSecond childSecond=new ChildSecond();
Integer value1 = childSecond.getValue();
interface 接口名称<泛型标识,泛型标识,...>{
public interface Generator<T> {
public class Apple implements Generator<String>{
public class Pair<T,E> implements Generator<T>{
public static void main(String[] args) {
Pair<String,Integer> pair=new Pair<>("count",100);
Integer value = pair.getValue();
System.out.println(key1+":"+value);
public与返回值中间<T>非常重要,可以理解为声明此方法为泛型方法只有声明了<T>的方法才是泛型方法,
<T>表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。
与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。
public class ProductGetter<T> {
ArrayList<T> list=new ArrayList<>();
product=list.get(random.nextInt(list.size()));
* @param <E>泛型标识,具体类型,由调用方法的时候指定
public <E> E getProduct(ArrayList<E> list){
return list.get(random.nextInt(list.size()));
public static <T,E,K> void printType(T t, E e, K k){
System.out.println(t + "\t" + t.getClass().getSimpleName());
System.out.println(e +"\t" +e.getClass().getSimpleName());
System.out.println(k + "\t" + k.getClass().getSimpleName ());
public static <E> void print(E... e){
for (int i = 0; i < e.length; i++) {
如果 static 方法要使用泛型能力,就必须使其成为泛型方法
public void setFirst(E first) {
public static void main(String[] args) {
Box<Integer> box1=new Box<>();
public static void showBox(Box<?> box){
Object first = box.getFirst();
public static void main(String[] args) {
ArrayList<MinCat> minCats=new ArrayList();
ArrayList<Cat> cats=new ArrayList();
ArrayList<Animal> animals=new ArrayList<>();
public static void showAnimal(ArrayList<? extends Cat> list){
for (int i = 0; i < list.size(); i++) {
ArrayList<String>[] listArr=new ArrayList<>[5];
public static void main(String[] args) {
ArrayList[] list=new ArrayList[5];
ArrayList<String>[] listArr=list;
ArrayList<Integer> intList=new ArrayList<>();
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at com.itheima.demo10.Test10.main(Test10.java:13)
可以通过java.lang.reflect.Array的newInstance(Class<T>,int)创建T[]数组
import java.lang.reflect.Array;
public Fruit(Class<T> clz,int length) {
array = (T[])Array.newInstance(clz, length);
public void put(int index,T item){
public void setName(String name) {
public static void main(String[] args) throws Exception {
Class<Person> personClass1 = Person.class;
Constructor<Person> constructor1 = personClass1.getConstructor();
Person person1 = constructor1.newInstance();
Class personClass2 = Person.class;
Constructor constructor2 = personClass2.getConstructor();
Object o = constructor2.newInstance();