目录
1.为什么会出现泛型?
2.泛型解决的问题
3.泛型类的基本使用
4.泛型方法的基本使用:
1.为什么会出现泛型?
从JDK1.5以后引入三大常用新特性:泛型,枚举,注解,其中泛型是一件非常主要的实现技术,他可以帮助我们解决程序的参数转换问题。
2.泛型解决的问题
假设需要你定义一个描述坐标的程序类Point,需要提供两个属性x、y。对于这两个属性的内容可能有如下选择:
1. x = 10、y = 20 ;
2. x = 10.1、y = 20.1 ;
3. x = 东经80度、y = 北纬20度
那么现在首先要解决的问题就是Point类中的x、y的属性类型问题,此时需要保存的有int、double、String,所以在 java中只有一种类型可以保存所有类型:Object型,
使用object范例:
class Fun{
private Object x;
private Object y;
public void setY(Object y) {
this.y = y;
}
public Object getY() {
return y;
}
public Object getX() {
return x;
}
public void setX(Object x) {
this.x = x;
}
}
public class object {
public static void main(String[] args) {
Fun fun=new Fun();
自动装箱并且向上转型为Object
fun.setX(100);
fun.setY("明天星期三");
强制向下转型为Integer并且自动拆箱
Integer integer= (Integer) fun.getX();
String s= (String) fun.getY();
System.out.println(integer);
System.out.println(s);
}
}
以上代码看起来已经解决问题,但是现在解决问题的关键在于Object,于是问题也就出现在Object上
观察以下程序:
Fun fun=new Fun();
fun.setX(100);
fun.setY("明天星期三");
Integer integer= (Integer) fun.getX();
Integer s= (Integer) fun.getY();
System.out.println(integer);
System.out.println(s);
这个个时候由于设置方的错误,将坐标内容设置成了Integer与String,但是接收方不知道,于是在执行时就会出现 ClassCastException。 ClassCastException指的是两个没有关系的对象进行强转出现的异常。 这个时候语法不会对其做任何限制,但执行的时候出现了程序错误,所以得出结论:向下转型是不安全的操作,会 带来隐患。进而使用泛型。
3.泛型类的基本使用
泛型指的就是类在定义的时候并不会设置类中的属性或方法中的参数的具体类型,而是在类使用的时候在进行定义。
泛型类的基本语法:
class MyClass {
T value1;
}
尖括号 <> 中的 T 被称作是类型参数,用于指代任何类型。实际上这个T你可以任意写,但出于规范的目的,Java 还 是建议我们用单个大写字母来代表类型参数。常见的如: T 代表一般的任何类。 E 代表 Element 的意思,或者 Exception 异常的意思。 K 代表 Key 的意思 V 代表 Value 的意思,通常与 K 一起配合使用。 S 代表 Subtype 的意思,文章后面部分会讲解示意。 如果一个类被 的形式定义,那么它就被称为是泛型类。定义泛型类之后如何使用呢?来看下面的代码:
MyClass<String> myClass1 = new MyClass<String>();
MyClass<Integer> myClass2 = new MyClass<Integer>();
引入多个参数类型
MyClass<String,Integer> myClass1 = new MyClass<String,Integer>();
注意:泛型只能接受类,所有的基本数据类型必须使用包装类!
范例:使用泛型定义Myclass类:
package 新特性.泛型.fanxing;
class Myclass<T>
{
private T x;
private T y;
public T getX (){
return x;
}
public void setX(T x)
{
this.x=x;
}
public T getY() {
return y;
}
public void setY(T y) {
this.y = y;
}
}
public class test {
public static void main(String[] args) {
Myclass<String > myclass=new Myclass<String>();
myclass.setX("今天要去上学");
myclass.setY("明天星期天");
String a=myclass.getX();
String b= myclass.getY();
System.out.println(a+"\n"+b);
Myclass<Integer> my=new Myclass<Integer>();
my.setX(100);
my.setY(200);
int x= my.getX();
int y= my.getY();
System.out.println(x+"\t"+y);
}
}
结果:
4.泛型方法的基本使用:
泛型方法定义:
class MyClass{
public void testMethod(T t) {
System.out.println(t);
}
}
范例:泛型方法和泛型类共存
class Myclass<T>
{
private T x;
public T getX (){
return x;
}
public void setX(T x)
{
this.x=x;
}
public <T> T add(T a)
{
return a;
}
public void fun(T b)
{
System.out.println(b);
}
}
public class test {
public static void main(String[] args) {
Myclass<String > myclass=new Myclass<String>();
myclass.setX("今天要去上学");
myclass.fun("hello");
String a=myclass.getX();
System.out.println(a);
Myclass<Integer> my=new Myclass<Integer>();
my.setX(100);
int x= my.getX();
System.out.println(x);
Integer integer=myclass.add(100);
System.out.println(integer);
}
}
上面代码中,MyClass 是泛型类, fun是泛型类中的普通方法,而 add是一个泛型方法。而泛型 类中的类型参数与泛型方法中的类型参数是没有相应的联系的,泛型方法始终以自己定义的类型参数为准
结果: