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

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. IDLE的使用

    为什么要用IDE? 到现在为止,我们也是写过代码的人啦,但你有没有发现,每次写代码要新建文件.写完保存时还要选择存放地点,执行时还要切换到命令行调用python解释器,好麻烦呀,能否一气呵成,让我简单 ...

  2. ajax的原生调用

    https://blog.csdn.net/jitianxia68/article/details/78393406

  3. url和资源的再理解

    元数据管理系统中, 确实是所有的静态资源都放在WebContent 不在dgs这个主项目中,通过url访问了 下面的这个项目在dgs中

  4. pread和pwrite函数

    先来介绍pread函数 [root@bogon mycode]# cat test.c #include<stdio.h> #include<stdlib.h> #includ ...

  5. Java和C++的区别杂记

    1.java中的作用域描述符(类比于C++是通过"."来实现,Java中"类名.静态成员名",C++中"类名::静态成员名" 2.java中 ...

  6. Singer 学习九 运行&&开发taps、targets (四 开发target)

    singer 的target 需要从stdin 的行数据,同时处理schema.record.state 消息 指南 schema 需要进行关联stream records 数据的校验 一旦Targe ...

  7. count(*) 和 count(1)和count(列名)区别

    执行效果上:  count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL  count(1)包括了所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL  cou ...

  8. trac

    F:\Python27>python F:\portabletrac\ez_setup.pyDownloading https://pypi.io/packages/source/s/setup ...

  9. mysql之 openark-kit online ddl

    MySQL工具集openark-kit (官方网站 http://code.openark.org/forge/openark-kit),内部包含很多小工具,在5.6之前用于实现online ddl操 ...

  10. centos git server 的搭建

    安装环境  centos7 说明:centos  yum 库里面的git  好像是不区分 客户端和服务器端, 安装 git 以后 就可以创建  仓库,也可以检出 别的 git 仓库的  代码了.所以不 ...