泛型(Generic)

1.定义:一种特殊的变量,保存的是引用变量的类型

2.好处:避免数据类型的转换;将运行时期ClassCastException提前到编译时期

3.自定义带泛型的类:
     public class A<泛型名>{

}
     注:类中凡是使用到数据类型的地方,都可以使用泛型名代替;
         泛型名自定义,但是将来使用者只能传递引用数据类型;

  1 代码实现:
  2 //自定义泛型类和泛型方法:
  3 class A<MM>{
  4 	private MM name;
  5 	private int age;
  6
  7 	public MM getName(){
  8 		return name;
  9 	}
 10 	public void setName(MM name){
 11 		this.name = name;
 12 	}
 13 	public int getAge(){
 14 		return age;
 15 	}
 16 	public void setAge(int age){
 17 		this.age = age;
 18 	}
 19
 20 	public void say(){
 21 		System.out.println(this.name+"\t"+this.age);
 22 	}
 23
 24 	//定义一个带泛型的方法,传入一个QQ类型的值,返回一个QQ类型的值
 25 	public <QQ> QQ show(QQ m){
 26 		System.out.println(m);
 27 		return m;
 28 	}
 29 }
 30
 31 public class MmDemo{
 32 	public static void main(String[] args){
 33 		//MM此处开始确定为String类型
 34 		A<String> a = new A<>();
 35 		a.setName("baobao");
 36 		a.setAge(24);
 37 		a.say();
 38 		//带泛型的show方法QQ此处定为String类型
 39 		a.show("xiaobao");//xiaobao
 40 		//带泛型的show方法QQ此处定为int类型
 41 		a.show(123);//123
 42
 43 		A<String> b = new A<>();
 44 		b.setName("rongrong");
 45 		b.setAge(12);
 46 		b.say();
 47
 48 	}
 49 }

4.自定义带泛型的方法:
     public <泛型名>泛型 getName(){
         return name;
     }

代码:见3.代码实现

5.自定义带泛型的接口:
     public interface B<泛型名>{

}
     注:接口中凡是使用到数据类型的地方都可以使用泛型名代替;

代码实现:

给泛型赋值的格式有两种形式:
     (1)在定义子类的时候,直接给接口的泛型传递固定的数据类型;
     public class 类名 implements 接口名<具体的数据类型>{
         在类中但凡是使用到数据类型的地方,都可以使用泛型名代替;
     }
     (2)在定义子类的时候也不确定数据类型,在创建子类对象的时候,确定数据类型
     public class 类名<泛型名B> implements 接口名<泛型名B>{
         在类中但凡是使用到数据类型的地方,都可以使用泛型名代替;
     }

  1 //定义一个带泛型的接口
  2 	interface A<W>{
  3 		//带泛型参数的show方法,抽象方法
  4 		public abstract void show(W w);
  5 	}
  6
  7 	//定义一个实现类--带泛型的实现类
  8 	class BImpl<W> implements A<W>{	//类名后需加上与接口一致的泛型名
  9 		@Override
 10 		public void show(W w){	//重写了带泛型的方法
 11 			System.out.println(w);
 12 		}
 13
 14 		public static void main(String[] args){
 15 			BImpl<String> b = new BImpl<>();
 16 			b.show("baobao");	//baobao
 17
 18 			BImpl<Integer> a = new BImpl<>();
 19 			a.show(12345);	//12345
 20 		}
 21 	}

6.泛型通配符:?

创建带泛型的类的对象的时候,泛型不能使用多态;只能使用通配符的形式,来达到这样的效果;

具体的通配符的符号:?  代表任意数据类型

对通配符的范围进行限定:
     ? extends 具体的数据类型A   此时是限定了上限;A类或A类的子类符合要求,其他数据类型不能传递;
     ? super   具体的数据类型A   此时是限定了下限;A类或A类的父类符合要求,其他数据类型不能传递;

代码实现:

  1 import java.util.List;
  2 	import java.util.ArrayList;
  3 	//定义一个父类
  4 	class Father{
  5
  6 	}
  7
  8 	//定义一个子类
  9 	class Son extends Father{
 10
 11 	}
 12
 13 	//定义一个测试类
 14 	public class FsDemo{
 15 		public static void main(String[] args){
 16 			//分别使用Object Father Son作为泛型,定义list集合
 17 			List<Object> Biggest = new ArrayList<>();
 18 			List<Father> Bigger = new ArrayList<>();
 19 			List<Son> Big = new ArrayList<>();
 20
 21 			//method1(Biggest);//错误: 不兼容的类型: List<Object>无法转换为List<? extends Father>
 22 			method1(Bigger);	//safe extends
 23 			method1(Big);	//safe extends
 24
 25 			method2(Biggest);	//safe super
 26 			method2(Bigger);	//safe super
 27 			//method2(Big);//错误: 不兼容的类型: List<Son>无法转换为List<? super Father>
 28
 29 		}
 30 			//定义带泛型的method1方法,上限为Father--? extends Father
 31 			public static void method1(List<? extends Father> list){
 32 				System.out.println("safe extends");
 33 			}
 34
 35 			//定义带泛型的method2方法,下限为Father--? super Father
 36 			public static void method2(List<? super Father> list){
 37 				System.out.println("safe super");
 38 			}
 39 	}
时间: 2024-10-12 17:41:56

泛型(Generic)的相关文章

Java基础之Comparable接口, Collections类,Iterator接口,泛型(Generic)

一.Comparable接口, Collections类 List的常用算法: sort(List); 排序,如果需要对自定义的类进行排序, 那就必须要让其实现Comparable接口, 实现比较两个类大小的方法 shuffle(List); 随机排列 void reverse(List); 逆序排列(Linked效率较高) copy(); 复制集合, 前提是size()相同(长度, 和容量的区别) fill(List, Object);使用某个对象填充整个List binarySearch()

JAVA学习笔记(五十六)- 泛型 Generic Types

泛型 Generic Types import java.util.ArrayList; import java.util.List; /* * 泛型 Generic Types * 集合泛型 * 类泛型 * 方法泛型 */ public class Test01 { public static void main(String[] args) { // 1.集合泛型,保证集合中元素的类型安全 List<Integer> nums = new ArrayList<Integer>(

Java之集合初探(二)Iterator(迭代器),collections,打包/解包(装箱拆箱),泛型(Generic),comparable接口

Iterator(迭代器) 所有实现了Collection接口的容器都有一个iterator方法, 用来返回一个实现了Iterator接口的对象 Iterator对象称作迭代器, 用来方便的实现对容器内的元素的遍历 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为"轻量级"对象,因为创建它的代价小. Java中的Iterator功能比较简单,并且只能单向移动: (1) 使用方法iterator()要求容器返回一个I

C#泛型(Generic)

一.什么是泛型 泛型(Generic)是C#语言2.0.通用语言运行时(CLR)2.0..NET Framework2.0推出来的新特性. 泛型为.NET框架引入类型参数(Type Parameters)的概念.类型参数使得设计类和方法时,不必确定一个或多个参具体数. 具体的参数类型可延迟到声明和使用时再确定.避免了运行时类型转换或装箱操作的代价和风险. 二.泛型的使用和对比 2.1.CommandMethod(普通方法) 1 /// <summary> 2 /// 打印一个Int值 3 //

泛型 Generic 类型擦除引起的问题及解决方法

参考:http://blog.csdn.net/lonelyroamer/article/details/7868820#comments 因为种种原因,Java不能实现真正的泛型,只能使用类型擦除来实现伪泛型,这样虽然不会有类型膨胀的问题,但是也引起了许多新的问题.所以,Sun对这些问题作出了许多限制,避免我们犯各种错误. 1.先检查,再编译,以及检查编译的对象和引用传递的问题 既然说类型变量会在编译的时候擦除掉,那为什么我们往ArrayList<String> arrayList=new

java 泛型(Generic)

java泛型(generic) 2016-07-11 问题 向集合存储元素存在安全性问题,即很可能不知道已有的集合中已经存储的元素的类型是什么,这时就不应该向该集合随便添加元素,否则与集合的设计的初衷相悖,因为集合存储的是同类型的元素,而且以后取集合中的元素不知道该转为什么类型. 从集合中获取元素需要强制类型转换,可能出现ClassCastException问题 未使用泛型举例: 说明:任何Object子类均可以存入Object集合,但是从集合中获取元素,则是Object对象,需要强制转换,可能

1、(知识篇)泛型Generic

泛型的使用: public class Test { public static void main(String[] args) { DoWork<Person> doWork = new DoWork<>(); doWork.doSth(new Person()); DoEat<Man> doEat = new DoEat<>(); doEat.doSth(new Man()); } // 普通类 public static class Person {

Java泛型Generic - Thinking in Java读书笔记

1.什么是泛型? 泛型就是可适用于很多的类,它实现了参数化类型type parameter的概念,参数化类型指可使用多种类型. 多态是一种泛化机制. 例如方法 A(Base b){}//Base是一个基类 这样方法A就可以接受从这个基类Base的任何子类作为参数.方法的参数也可以是一个接口,但是由于类的单继承体系和接口的约束( An interface still requires that your code works with that particular interface. ),不能

1.泛型(Generic)

一.泛型 泛型就是封装,将重复的工作简单化 1.泛型方法 public static void Show<T>(T tParameter) { Console.WriteLine("This is {0}, parameter = {1}, type = {2}", typeof(CommonMethod).Name, tParameter.GetType(), tParameter); } 2.泛型类 public class GenericClass<T>{