认识泛型
1、泛型是在JDK1.5之后增加的新功能。泛型(Generic)
2、泛型可以解决数据类型的安全性问题,他主要的原理,是在类声明的时候通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。
3、格式:
访问权限 class 类名称<泛型,泛型>{
属性
方法
}
4、对象的创建
类名称<具体类型> 对象名称=new 类名称<具体类型>();
示例:
//class里面不明确指定什么类型
class Point<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 GenericDemo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//需要什么类型就传递什么类型
Point<String> p=new Point<String>();
p.setX("精度为:109");
p.setY("纬度为:100");
System.out.println(p.getX()+" "+p.getY());
}
}
构造方法中使用泛型
构造方法可以为类中的属性初始化,那么如果类中的属性通过泛型指定,而又需要通过构造方法设置属性内容的时候,那么构造方法的定义与之前并无不同,不需要像声明类那样指定泛型。
示例:
class Con1<T>{
private T value;
public Con1(T value){
this.value=value;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
}
public class GenericDemo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Con1<String> c=new Con1<String>("jingchenyong");
System.out.println(c.getValue());
}
}
设置多个泛型
1、设置多个泛型直接在<>中添加多个泛型就可以了。(一般泛型有两个就行了)
示例:
class Gen<K,T>{
private K key;
private T take;
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
public T getTake() {
return take;
}
public void setTake(T take) {
this.take = take;
}
}
public class GenericDemo3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Gen<String,<span style="color:#ff0000;">Integer</span>>g=new Gen<String, <span style="color:#ff0000;">Integer</span>>();
g.setKey("jingchenyong");
g.setTake(10);
System.out.println(g.getKey()+" "+g.getTake());
}
}
通配符
示例:
class Info<T>{
private T key;
public T getKey() {
return key;
}
public void setKey(T key) {
this.key = key;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return this.getKey().toString();
}
}
public class GenericDemo4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Info<String> i=new Info<String>();
i.setKey("jingchenyong");
tell(i);
}
/**
* 通配符:?
* @param i
*/
public static void tell(Info<?> i){
System.out.println(i);
}
// public static void tell(Info i){
// System.out.println(i);//jingchenyong
// }
}
泛型接口
1、在JDK1.5之后,不仅仅可以声明泛型类,也可以声明泛型接口,声明泛型接口和声明泛型类的语法类似,也是在接口名称后面加上<T>
示例:
interface GenInter<T>{
public void say();
}
//用法一:
class Gin<T> implements GenInter<T>{
private T info;
public Gin(T info){
this.info=info;
}
public T getInfo() {
return info;
}
public void setInfo(T info) {
this.info = info;
}
@Override
public void say() {
// TODO Auto-generated method stub
}
}
public class GenericDemo5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Gin<String> g=new Gin<String>("jingchenyong");
System.out.println(g.getInfo());
}
}
//用法二:
//class Gin implements GenInter<String>{
// private String info;
// public Gin(String info){
// this.info=info;
// }
// public String getInfo() {
// return info;
// }
// public void setInfo(String info) {
// this.info = info;
// }
// @Override
// public void say() {
// // TODO Auto-generated method stub
//
// }
//
//}
//public class GenericDemo5 {
// public static void main(String[] args) {
// // TODO Auto-generated method stub
// Gin g=new Gin("jingchenyong");
// System.out.println(g.getInfo());
// }
//}
泛型方法
1、泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据类型
2、格式
访问权限 <泛型标识> 泛型标识 方法名称([泛型标识 参数名称])
示例:
class Gener{
public <T>T tell(T t){
return t;
}
}
public class GenericDemo6 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Gener g=new Gener();
String str=g.tell("jingchenyong");
System.out.println(str);
int i=g.tell(10);
System.out.println(i);
}
}
泛型数组
1、在使用泛型方法的时候,也可以传递或返回一个泛型数组
public class GenericDemo7 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String arr[]={"jingchenyong1","jingchenyong2","jingchenyong3"};
tell(arr);
<span style="color:#ff0000;">Integer arr1[]={1,2,3};</span>
tell(arr1);
}
public static <T>void tell(T arr[]){
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
}
(1)泛型就是为了不同类调同一个方法会有不同的结果而设计的。首先它必须是一个类,而基本类型不是类。
(2)java 泛型数组,数据类型可以填写Integer,Float,String而不是int,float
public class test {
public static void main(String[] args) {
Float[] arr = { 1.0f,2.0f,3.0f,4.0f };//改成float就不行
tell(arr);
}
public static <T>void tell(T arr[]) {
for(int i =0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}