泛型
1、什么是泛型
在定义类时,不给定类中成员 [ 属性 方法的返回类型 方法的参数 ] 的数据 类型,而在类对象创建时为其指定相应的数据类型。
2、为什么使用泛型
要求: x和y的值可以都是字符串类型,x和y的值都是小数类型,
//x,y的值都是字符串类型
Pate pate = new Pate("东经180度","北纬72度");
//x,y的值都是整型
Pate pate1 = new Pate(180,72);
//x,y的值都是小数类型
Pate pate2 = new Pate(180.9,72.9);
//可以一个是字符串一个是整型
Pate pate3 = new Pate("东经180度",72);
String x =(String) pate3.getX();
System.out.println(x);
//数据类型不安全问题。--因为你在定义Pate类型指定的属性类型为object
//代码运行就会报错
String y =(String) pate3.getY();
System.out.println(y);
所以导致我们在给Pate类中属性赋值时可以赋值任意类型,在后面获取相应属性时,会出现数据类型安全问题。
我们可以使用泛型来解决上面的数据类型安全问题。
3、
语法:
public class 类名<泛型标志,泛型标志.....>{ public 泛型标志 属性名; } --泛型标志可以是任意字符。习惯使用Tpublic class Pate<T> { public T x; public T y; public Pate() { } public Pate(T x, T y) { this.x = x; this.y = 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; } @Override public String toString() { return "Pate{" + "x=" + x + ", y=" + y + '}'; }//定义String字符串类型 Pate<String > pate = new Pate<String >("东经180度","北纬72度"); String x = pate.getX(); String y = pate.getY(); System.out.println(x); System.out.println(y); //定义Numbern类型 Pate<Number > pate1 = new Pate<Number>(180,72); Number x1 = pate1.getX(); Number y1 = pate1.getY(); System.out.println(x1); System.out.println(y1); // //出现数据类型转换问题----不会出现数据类型安全问题。4、
public class Pate<T> { public T x; public T y; public void show(){ System.out.println(x); System.out.println(y); } public Pate() { } public Pate(T x, T y) { this.x = x; this.y = 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; } @Override public String toString() { return "Pate{" + "x=" + x + ", y=" + y + '}'; }public static void main(String[] args) { /*string类型*/ Pate<String> pate = new Pate<String >("东经180度","北纬72度"); /*Integer类型*/ Pate<Integer> pate1 = new Pate<Integer>(180,72); /*Double类型*/ Pate<Double> pate2 = new Pate<Double>(520.5,123.6) ; /*任意类型*/ fun2(pate); } public static void fun2(Pate<?> pate){pate.show();}5、
public class Pate<T> { public T x; public T y; public void show(){ System.out.println(x); System.out.println(y); } public Pate() { } public Pate(T x, T y) { this.x = x; this.y = 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; } @Override public String toString() { return "Pate{" + "x=" + x + ", y=" + y + '}'; }public static void main(String[] args) { Pate<String > pate = new Pate<String >("东经180度","北纬72度"); Pate<Number > pate1 = new Pate<Number>(180,72); Pate<Integer > pate2 = new Pate<Integer>(520,123) ; /*string类型*/ fun(pate1); /*Number类型*/ fun1(pate2); /*Integer类型*/ fun2(pate); } /** * 泛型的下限--泛型类型 不能小于Number类型要么为Number的父类 * @param pate */ public static void fun(Pate<? super Number> pate){ pate.show(); } /** * 泛型的上限--泛型类型 不能大于Number类型要么为Number的子类 * @param pate */ public static void fun1(Pate<? extends Number> pate){pate.show();} /** * 泛型任意类型 * @param pate */ public static void fun2(Pate<?> pate){pate.show();}
public interface 接口名<泛型标识,....>{ }接口用来被类实现。一个类如何实现泛型接口。有两种方式
(1)在实现泛型接口时为泛型接口指定类型。
(2) 该类也是一个泛型类,而且该类使用的泛型标志必须和接口的标志一致。
public static void main(String[] args) { Mouse mouse = new Mouse(); mouse.use("今日复明日"); Upen<Integer> integerUpen = new Upen<>(); integerUpen.use(456); } } /** * 定义泛型的接口 * * @param <T> */ interface USB<T> { public abstract void use(T t); } /** * 第一种 类实现泛型接口时为其指定泛型类型 */ class Mouse implements USB<String> { public void use(String s) { System.out.println("---" + s); } } /** * 第二种 类实现接口时该类也泛型类,标志必须和接口的泛型标志一致 List ArrayList * @param <T> */ class Upen<T> implements USB<T> { public void use(T t) { System.out.println("---" + t); } }
【泛型方法的简单定义】
[访问权限] <泛型标识> 泛型标识 方法名称(泛型标识 参数名称){
}
public static void main(String[] args) { PateTxt pateTxt = new PateTxt(); Integer fun = pateTxt.fun(15); String i = pateTxt.fun("今日复明日"); } /** * 泛型方法 * @param t * @return * @param <T> */ public <T> T fun(T t){ System.out.println("----"+t); return t; } }

浙公网安备 33010602011771号