java泛型详解(接口与方法、通配符、堆污染、多态---含代码!)

本文详细介绍了Java中的泛型,包括泛型类、泛型接口、泛型方法的使用,探讨了泛型通配符与上下限、泛型擦除的概念,以及泛型与多态的区别,并通过实例代码展示了堆污染的三种情况及如何避免。
摘要由CSDN通过智能技术生成

一、前言

二、泛型类

2.1 概述

Java中泛型使用情况大致包括三种:泛型类泛型接口泛型方法

本节演示泛型类。

2.2 代码

2.2.1 泛型类一个字母、显式指定泛型实参

package mypackage泛型类;

//泛型类一个字母、显示指定泛型实参    则当前泛型由实参指定    
//此时,注意传入的实参必须为引用类型,不能为基本类型,如果是8种基本类型,则传入它们的包装类型
public class Test {
   

   public static void main(String[] args) {
   
   	GenericClass genericClass = new GenericClass<Integer>(123);
   	GenericClass genericClass2 = new GenericClass<String>("abc");
   	System.out.println(genericClass);
   	System.out.println(genericClass2);
   }

}

class GenericClass<T> {
    // 定义泛型类 就是在定义类的时候,类名后面加上<T> 这个字母任意取 可以是T E V或者其他字母

   private T key;

   public T getKey() {
   
   	return key;
   }

   public void setKey(T key) {
   
   	this.key = key;
   }

   public GenericClass(T key) {
   
   	super();
   	this.key = key;
   }

   @Override
   public String toString() {
   
   	return "GenericClass [key=" + key + "]";
   }

}

输出1:

GenericClass [key=123]
GenericClass [key=abc]

小结1:泛型类一个字母、显示指定泛型实参 则当前泛型由实参指定
注意:此时传入的实参必须为引用类型,不能为基本类型,如果是8种基本类型,则传入它们的包装类型

2.2.2 泛型类一个字母,不显示指定泛型实参

package mypackage泛型类2;

//泛型类一个字母、不显示指定泛型实参
public class Test {
   

   public static void main(String[] args) {
   
   	// 虽然不显式指定T 但是传入参数的时候动态指定了T
   	GenericClass genericClass = new GenericClass(123); // T为Integer
   	GenericClass genericClass2 = new GenericClass("abc"); // T为String
   	System.out.println(genericClass);
   	System.out.println(genericClass2);

   }

}

class GenericClass<T> {
    // 定义泛型类 就是在定义类的时候,类名后面加上<T> 这个字母任意取 可以是T E V或者其他字母

   private T key;

   public T getKey() {
   
   	return key;
   }

   public void setKey(T key) {
   
   	this.key = key;
   }

   public GenericClass(T key) {
   
   	super();
   	this.key = key;
   }

   @Override
   public String toString() {
   
   	return "GenericClass [key=" + key + "]";
   }

}

输出2:

GenericClass [key=123]
GenericClass [key=abc]

小结2:泛型类一个字母、不显示指定泛型实参,虽然不显式指定T ,但是传入参数的时候动态指定了T

2.2.3 泛型类两个字母、显式指定泛型实参

package mypackage泛型类;

//泛型类两个字母、显示指定泛型实参
public class Test1 {
   

   public static void main(String[] args) {
   
   	GenericClass1 genericClass = new GenericClass1<String, Integer>("小A", 95);

   	System.out.println(genericClass);

   }

}

class GenericClass1<K, V> {
    // 定义泛型类 就是在定义类的时候,类名后面加上<T> 这个字母任意取 可以是T E V或者其他字母

   private K key;
   private V value;

   public K getKey() {
   
   	return key;
   }

   public void setKey(K key) {
   
   	this.key = key;
   }

   public V getValue() {
   
   	return value;
   }

   public void setValue(V value) {
   
   	this.value = value;
   }

   @Override
   public String toString() {
   
   	return "GenericClass [key=" + key + ", value=" + value + "]";
   }

   public GenericClass1(K key, V value) {
   
   	super();
   	this.key = key;
   	this.value = value;
   }

}

输出3:

GenericClass [key=小A, value=95]

小结3:泛型类两个字母、显示指定泛型实参,直接在一个字母扩展就好,同理多个字母都可以扩展

2.2.4 泛型类两个字母,不显示指定泛型实参

package mypackage泛型类2;

//泛型类两个字母、不显示指定泛型实参
public class Test1 {
   

   public static void main(String[] args) {
   
   	// 虽然不显式指定T 但是传入参数的时候动态指定了T
   	GenericClass1 genericClass = new GenericClass1("小A", 123); // T为Integer
   	System.out.println(genericClass);

   }

}

class GenericClass1<K, V> {
    // 定义泛型类 就是在定义类的时候,类名后面加上<T> 这个字母任意取 可以是T E V或者其他字母

   private K key;
   private V value;

   public K getKey() {
   
   	return key;
   }

   public void setKey(K key) {
   
   	this.key = key;
   }

   public V getValue() {
   
   	return value;
   }

   p
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值