编写泛型类比普通的类要麻烦,而且很少编写泛型类。

1.编写一个泛型类:

  • 按照某种类型(例如String)编写类
  • 标记所有的特定类型例如String
  • 把特定类型替换为T,并申明



    Pair.java
package com.testArray;

public class Pair<T> {
private T fisrt;
private T last;
public Pair(T first,T last){
this.fisrt=first;
this.last=last;
}
public T getFisrt(){
return fisrt;
}
public T getLast(){
return last;
}
}

Main.java

package com.testArray;

import java.util.ArrayList;

public class Main {
public static void main(String[] args){
Pair<String> p = new Pair<String>("小明", "小红");
String first = p.getFisrt();
String last = p.getLast();
System.out.println(first+"\t"+last);
System.out.println(p.getClass() == Pair.class);
}
}


## 2.泛型类包含静态方法
注意:
泛型类型不能用于静态方法:
* 编译错误
* 编译器无法在静态字段或静态方法中使用泛型类型


* 静态方法可以单独改写为泛型方法
网上有种解决方法,在static后面加上,就解决了报错问题。但此处static方法中的和上面Pair类中的不一样,为了避免混淆,应该将替换为。
```#java
public static Pair create(T first,T last){
return new Pair(first,last);
}
```
```#java
package com.testArray;

public class Pair {

private T fisrt;

private T last;

public Pair(T first,T last){

this.fisrt=first;

this.last=last;

}

public T getFisrt(){

return fisrt;

}

public T getLast(){

return last;

}

static Pair create(K first,K last){

return new Pair(first,last);

}

}

```#java
package com.testArray; public class Main {
public static void main(String[] args){
Pair<String> p = Pair.create("小明", "小红");
String first = p.getFisrt();
String last = p.getLast();
System.out.println(first+"\t"+last);
System.out.println(p.getClass() == Pair.class);
}
}

3.泛型可以定义多种类型

Pair.java

package com.testArray;

public class Pair<T,K> {
private T fisrt;
private K last;
public Pair(T first,K last){
this.fisrt=first;
this.last=last;
}
public T getFisrt(){
return fisrt;
}
public K getLast(){
return last;
}
}

Main.java

package com.testArray;

public class Main {
public static void main(String[] args){
Pair<String,Integer> p = new Pair<String,Integer>("小明", 12);
String first = p.getFisrt();
Integer last = p.getLast();
System.out.println(first+"\t"+last);
System.out.println(p.getClass() == Pair.class);
}
}

4.总结:

  • 编写泛型时,需要定义泛型类型

    * public class Pair{...}
  • 静态方法不能引用泛型类型,必须定义其他类型来实现范型

    * public static Pair create(K first, K last){...}
  • 泛型可以同时定义多种类型<T,K>

    * public class Pair<T,K>{...}

廖雪峰Java4反射与泛型-3范型-3编写泛型的更多相关文章

  1. 廖雪峰Java4反射与泛型-3范型-4擦拭法

    1.擦拭法是Java泛型的实现方式. 编译器把类型视为Object. * 泛型代码编译的时候,编译器实际上把所有的泛型类型T统一视为Object类型.换句话说,虚拟机对泛型一无所知,所有的工作都是编译 ...

  2. 廖雪峰Java4反射与范型-3范型-1什么是泛型

    1.为什么需要泛型? JDK提供了ArrayList,可以看作"可变长度"的数组: 比数组使用方便 示例1:如果使用ArrayList存储String类型: 需要强制转型 不方便, ...

  3. 廖雪峰Java4反射与泛型-3泛型-7泛型和反射

    1.部分反射API是泛型 1.1获取反射API的泛型 部分反射API是泛型,如Class<T>是泛型 //如果使用Class,不带泛型,出现compile warning编译警告 Clas ...

  4. 廖雪峰Java4反射与泛型-3范型-6super通配符

    1.super通配符 1.1super通配符第一种用法 泛型的继承关系 Pair<Integer>不是Pair<Number>的子类,如 static void set(Pai ...

  5. 廖雪峰Java4反射与泛型-3范型-5extends通配符

    1.泛型的继承关系: Pair<Integer>不是Pair<Number>的子类 add()不接受Pair<Integer> Pair.java package ...

  6. 廖雪峰Java4反射与泛型-2注解-3处理注解

    1.处理注解 注解本身对对代码逻辑没有任何影响 SOURCE类型的注解在编译期就被丢掉了 CLASS类型的注解仅保存在class文件中 RUNTIME类型的注解在运行期可以被读取 如何使用注解由工具决 ...

  7. 廖雪峰Java4反射与泛型-1反射-2访问字段Field和3调用方法Method

    2.字段Field 2.1.通过Class实例获取字段field信息: getField(name): 获取某个public的field,包括父类 getDeclaredField(name): 获取 ...

  8. 廖雪峰Java4反射与泛型-1反射-1Class类

    1.Class类与反射定义 Class类本身是一种数据类型(Type),class/interface的数据类型是Class,JVM为每个加载的class创建了唯一的Class实例. Class实例包 ...

  9. 廖雪峰Java4反射与泛型-2注解-2定义注解

    1.定义注解 使用@interface定义注解Annotation 注解的参数类似无参数方法 可以设定一个默认值(推荐) 把最常用的参数命名为value(推荐) 2.元注解 2.1Target使用方式 ...

随机推荐

  1. C++学习(十五)(C语言部分)之 数组二

    数组大纲 多维数组 二维数组 重点 (三位以上基本不会用到) 都是用来存数据 一个班有20个人 可以用一维数组存20个人的年龄 int age[20]; 一个年级10个班 每个班20人 int age ...

  2. putty登陆sourceforge.net(密钥的设置)

    现在直接启动putty.exe是不能登陆sourceforge.net 的.按vps的方式,输入地址.用户名和密码后,程序就自动关闭.在登入前需要安装密匙,具体做法如下: 首先得生成一个SSH Key ...

  3. JS 数组常用的方法

    数组常用的方法: x.toString()方法:任何对象都有toString方法.        将任何对象转为字符串. 一般不主动调用,系统在需要时自动调用 x.valueOf()方法:同toStr ...

  4. oracle重做日志文件硬盘坏掉解决方法

    rman target/ list backup; list backup summary; 删除数据库数据文件夹下的log日志,例如/u01/app/oracle/oradata/ORCL下的所有后 ...

  5. Generic Realtime Intermediary Protocol

    转自:https://pushpin.org/docs/protocols/grip/ Introduction The Generic Realtime Intermediary Protocol ...

  6. C#更新程序设计

    更新程序设计 大致设想了两种更新方式,如下所示: 一种简单暴力,直接请求静态资源服务器上的文件 第二种考虑了网络传输不稳定时,中断的情况.再次启动更新时会检测本地文件下载多少了,然后接着上次中断的位置 ...

  7. 实现一个函数,可以左旋字符串中的k个字符

    ABCD左旋一个字符得到BCDAABCD左旋两个字符得到CDAB ABCD BACD BCAD BCDA CBDA CDBA CDAB 发现规律: 如果左旋一个字符则可以将第一个字符依次与后面的字符交 ...

  8. RTMP、RTSP、HTTP可用的地址

    香港卫视:  rtmp://live.hkstv.hk.lxdns.com/live/hks1 香港财经,rtmp://202.69.69.180:443/webcast/bshdlive-pc 韩国 ...

  9. Spring5 新特性

    Spring Framework 5.0是在Spring Framework 4.0之后将近四年内一次重大的升级. 最大特点之一是响应式编程(Reactive Programming). 响应式编程核 ...

  10. python re正则模块

    re 正则表达式操作  本模块提供了类似于Perl的正则表达式匹配操作.要匹配的模式和字符串可以是Unicode字符串以及8位字符串. 正则表达式使用反斜杠字符('\')来表示特殊的形式或者来允许使用 ...