`

Java 泛型

阅读更多

普通泛型

Java代码
  1. class Point<T>{ // 此处可以随便写标识符号,T是type的简称
  2. private T var ; // var的类型由T指定,即:由外部指定
  3. public T getVar(){ // 返回值的类型由外部决定
  4. return var ;
  5. }
  6. publicvoid setVar(T var){ // 设置的类型也由外部决定
  7. this.var = var ;
  8. }
  9. };
  10. publicclass GenericsDemo06{
  11. publicstaticvoid main(String args[]){
  12. Point<String> p = new Point<String>() ; // 里面的var类型为String类型
  13. p.setVar("it") ; // 设置字符串
  14. System.out.println(p.getVar().length()) ; // 取得字符串的长度
  15. }
  16. };
  17. ----------------------------------------------------------
  18. class Notepad<K,V>{ // 此处指定了两个泛型类型
  19. private K key ; // 此变量的类型由外部决定
  20. private V value ; // 此变量的类型由外部决定
  21. public K getKey(){
  22. returnthis.key ;
  23. }
  24. public V getValue(){
  25. returnthis.value ;
  26. }
  27. publicvoid setKey(K key){
  28. this.key = key ;
  29. }
  30. publicvoid setValue(V value){
  31. this.value = value ;
  32. }
  33. };
  34. publicclass GenericsDemo09{
  35. publicstaticvoid main(String args[]){
  36. Notepad<String,Integer> t = null ; // 定义两个泛型类型的对象
  37. t = new Notepad<String,Integer>() ; // 里面的key为String,value为Integer
  38. t.setKey("汤姆") ; // 设置第一个内容
  39. t.setValue(20) ; // 设置第二个内容
  40. System.out.print("姓名;" + t.getKey()) ; // 取得信息
  41. System.out.print(",年龄;" + t.getValue()) ; // 取得信息
  42. }
  43. };

通配符

Java代码
  1. class Info<T>{
  2. private T var ; // 定义泛型变量
  3. publicvoid setVar(T var){
  4. this.var = var ;
  5. }
  6. public T getVar(){
  7. returnthis.var ;
  8. }
  9. public String toString(){ // 直接打印
  10. returnthis.var.toString() ;
  11. }
  12. };
  13. publicclass GenericsDemo14{
  14. publicstaticvoid main(String args[]){
  15. Info<String> i = new Info<String>() ; // 使用String为泛型类型
  16. i.setVar("it") ; // 设置内容
  17. fun(i) ;
  18. }
  19. publicstaticvoid fun(Info<?> temp){ // 可以接收任意的泛型对象
  20. System.out.println("内容:" + temp) ;
  21. }
  22. };

受限泛型

Java代码
  1. class Info<T>{
  2. private T var ; // 定义泛型变量
  3. publicvoid setVar(T var){
  4. this.var = var ;
  5. }
  6. public T getVar(){
  7. returnthis.var ;
  8. }
  9. public String toString(){ // 直接打印
  10. returnthis.var.toString() ;
  11. }
  12. };
  13. publicclass GenericsDemo17{
  14. publicstaticvoid main(String args[]){
  15. Info<Integer> i1 = new Info<Integer>() ; // 声明Integer的泛型对象
  16. Info<Float> i2 = new Info<Float>() ; // 声明Float的泛型对象
  17. i1.setVar(30) ; // 设置整数,自动装箱
  18. i2.setVar(30.1f) ; // 设置小数,自动装箱
  19. fun(i1) ;
  20. fun(i2) ;
  21. }
  22. publicstaticvoid fun(Info<? extends Number> temp){ // 只能接收Number及其Number的子类
  23. System.out.print(temp + "、") ;
  24. }
  25. };
  26. ----------------------------------------------------------
  27. class Info<T>{
  28. private T var ; // 定义泛型变量
  29. publicvoid setVar(T var){
  30. this.var = var ;
  31. }
  32. public T getVar(){
  33. returnthis.var ;
  34. }
  35. public String toString(){ // 直接打印
  36. returnthis.var.toString() ;
  37. }
  38. };
  39. publicclass GenericsDemo21{
  40. publicstaticvoid main(String args[]){
  41. Info<String> i1 = new Info<String>() ; // 声明String的泛型对象
  42. Info<Object> i2 = new Info<Object>() ; // 声明Object的泛型对象
  43. i1.setVar("hello") ;
  44. i2.setVar(new Object()) ;
  45. fun(i1) ;
  46. fun(i2) ;
  47. }
  48. publicstaticvoid fun(Info<? super String> temp){ // 只能接收String或Object类型的泛型
  49. System.out.print(temp + "、") ;
  50. }
  51. };

泛型无法向上转型

Java代码
  1. class Info<T>{
  2. private T var ; // 定义泛型变量
  3. publicvoid setVar(T var){
  4. this.var = var ;
  5. }
  6. public T getVar(){
  7. returnthis.var ;
  8. }
  9. public String toString(){ // 直接打印
  10. returnthis.var.toString() ;
  11. }
  12. };
  13. publicclass GenericsDemo23{
  14. publicstaticvoid main(String args[]){
  15. Info<String> i1 = new Info<String>() ; // 泛型类型为String
  16. Info<Object> i2 = null ;
  17. i2 = i1 ; //这句会出错 incompatible types
  18. }
  19. };

泛型接口

Java代码
  1. interface Info<T>{ // 在接口上定义泛型
  2. public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型
  3. }
  4. class InfoImpl<T> implements Info<T>{ // 定义泛型接口的子类
  5. private T var ; // 定义属性
  6. public InfoImpl(T var){ // 通过构造方法设置属性内容
  7. this.setVar(var) ;
  8. }
  9. publicvoid setVar(T var){
  10. this.var = var ;
  11. }
  12. public T getVar(){
  13. returnthis.var ;
  14. }
  15. };
  16. publicclass GenericsDemo24{
  17. publicstaticvoid main(String arsg[]){
  18. Info<String> i = null; // 声明接口对象
  19. i = new InfoImpl<String>("汤姆") ; // 通过子类实例化对象
  20. System.out.println("内容:" + i.getVar()) ;
  21. }
  22. };
  23. ----------------------------------------------------------
  24. interface Info<T>{ // 在接口上定义泛型
  25. public T getVar() ; // 定义抽象方法,抽象方法的返回值就是泛型类型
  26. }
  27. class InfoImpl implements Info<String>{ // 定义泛型接口的子类
  28. private String var ; // 定义属性
  29. public InfoImpl(String var){ // 通过构造方法设置属性内容
  30. this.setVar(var) ;
  31. }
  32. publicvoid setVar(String var){
  33. this.var = var ;
  34. }
  35. public String getVar(){
  36. returnthis.var ;
  37. }
  38. };
  39. publicclass GenericsDemo25{
  40. publicstaticvoid main(String arsg[]){
  41. Info i = null; // 声明接口对象
  42. i = new InfoImpl("汤姆") ; // 通过子类实例化对象
  43. System.out.println("内容:" + i.getVar()) ;
  44. }
  45. };

泛型方法

Java代码
  1. class Demo{
  2. public <T> T fun(T t){ // 可以接收任意类型的数据
  3. return t ; // 直接把参数返回
  4. }
  5. };
  6. publicclass GenericsDemo26{
  7. publicstaticvoid main(String args[]){
  8. Demo d = new Demo() ; // 实例化Demo对象
  9. String str = d.fun("汤姆") ; // 传递字符串
  10. int i = d.fun(30) ; // 传递数字,自动装箱
  11. System.out.println(str) ; // 输出内容
  12. System.out.println(i) ; // 输出内容
  13. }
  14. };

通过泛型方法返回泛型类型实例

Java代码
  1. class Info<T extends Number>{ // 指定上限,只能是数字类型
  2. private T var ; // 此类型由外部决定
  3. public T getVar(){
  4. returnthis.var ;
  5. }
  6. publicvoid setVar(T var){
  7. this.var = var ;
  8. }
  9. public String toString(){ // 覆写Object类中的toString()方法
  10. returnthis.var.toString() ;
  11. }
  12. };
  13. publicclass GenericsDemo27{
  14. publicstaticvoid main(String args[]){
  15. Info<Integer> i = fun(30) ;
  16. System.out.println(i.getVar()) ;
  17. }
  18. publicstatic <T extends Number> Info<T> fun(T param){//方法中传入或返回的泛型类型由调用方法时所设置的参数类型决定
  19. Info<T> temp = new Info<T>() ; // 根据传入的数据类型实例化Info
  20. temp.setVar(param) ; // 将传递的内容设置到Info对象的var属性之中
  21. return temp ; // 返回实例化对象
  22. }
  23. };

使用泛型统一传入的参数类型

Java代码
  1. class Info<T>{ // 指定上限,只能是数字类型
  2. private T var ; // 此类型由外部决定
  3. public T getVar(){
  4. returnthis.var ;
  5. }
  6. publicvoid setVar(T var){
  7. this.var = var ;
  8. }
  9. public String toString(){ // 覆写Object类中的toString()方法
  10. returnthis.var.toString() ;
  11. }
  12. };
  13. publicclass GenericsDemo28{
  14. publicstaticvoid main(String args[]){
  15. Info<String> i1 = new Info<String>() ;
  16. Info<String> i2 = new Info<String>() ;
  17. i1.setVar("HELLO") ; // 设置内容
  18. i2.setVar("汤姆") ; // 设置内容
  19. add(i1,i2) ;
  20. }
  21. publicstatic <T> void add(Info<T> i1,Info<T> i2){
  22. System.out.println(i1.getVar() + " " + i2.getVar()) ;
  23. }
  24. };

泛型数组

Java代码
  1. publicclass GenericsDemo30{
  2. publicstaticvoid main(String args[]){
  3. Integer i[] = fun1(1,2,3,4,5,6) ; // 返回泛型数组
  4. fun2(i) ;
  5. }
  6. publicstatic <T> T[] fun1(T...arg){ // 接收可变参数
  7. return arg ; // 返回泛型数组
  8. }
  9. publicstatic <T> void fun2(T param[]){ // 输出
  10. System.out.print("接收泛型数组:") ;
  11. for(T t:param){
  12. System.out.print(t + "、") ;
  13. }
  14. }
  15. };

泛型的嵌套设置

Java代码
  1. class Info<T,V>{ // 接收两个泛型类型
  2. private T var ;
  3. private V value ;
  4. public Info(T var,V value){
  5. this.setVar(var) ;
  6. this.setValue(value) ;
  7. }
  8. publicvoid setVar(T var){
  9. this.var = var ;
  10. }
  11. publicvoid setValue(V value){
  12. this.value = value ;
  13. }
  14. public T getVar(){
  15. returnthis.var ;
  16. }
  17. public V getValue(){
  18. returnthis.value ;
  19. }
  20. };
  21. class Demo<S>{
  22. private S info ;
  23. public Demo(S info){
  24. this.setInfo(info) ;
  25. }
  26. publicvoid setInfo(S info){
  27. this.info = info ;
  28. }
  29. public S getInfo(){
  30. returnthis.info ;
  31. }
  32. };
  33. publicclass GenericsDemo31{
  34. publicstaticvoid main(String args[]){
  35. Demo<Info<String,Integer>> d = null ; // 将Info作为Demo的泛型类型
  36. Info<String,Integer> i = null ; // Info指定两个泛型类型
  37. i = new Info<String,Integer>("汤姆",30) ; // 实例化Info对象
  38. d = new Demo<Info<String,Integer>>(i) ; // 在Demo类中设置Info类的对象
  39. System.out.println("内容一:" + d.getInfo().getVar()) ;
  40. System.out.println("内容二:" + d.getInfo().getValue()) ;
  41. }
  42. };

 

泛型方法不一定要通过参数来确定泛型准确类型,可以只通过返回值,比如:

public static <E> ArrayList<E> newArrayList() {
return new ArrayList<E>();
}

 

public List<PrepaidHistory> queryHistories(Long skyid,PrepaidHistoryType type, Date from, Date end) {

    。。。
return Lists.newArrayList();
}

 

这样Lists.newArrayList();
智能的知道返回类型为PrepaidHistory

分享到:
评论

相关推荐

    Java泛型编程指南.pdf

    Java泛型编程指南.pdf 此文章译自SUN的泛型编程指南

    Java泛型和集合

    Java Generics and Collections 英文版,详细描述java 泛型技术

    java 泛型类的类型识别示例

    java 泛型类的类型识别示例 java 泛型类的类型识别示例 java 泛型类的类型识别示例

    java 泛型接口示例

    java 泛型接口示例 java 泛型接口示例 java 泛型接口示例

    java 泛型方法使用示例

    java 泛型方法使用示例 java 泛型方法使用示例 java 泛型方法使用示例

    Java泛型的用法及T.class的获取过程解析

    主要介绍了Java泛型的用法及T.class的获取过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    JAVA泛型加减乘除

    这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...

    java泛型技术之发展

    java泛型技术之发展,学习JAVA 泛型的不错东东

    1.java泛型定义.zip

    1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1....

    很好的Java泛型的总结

    很好的Java泛型的总结,看完之后你一定会知道java泛型的底层机制,你一定会学会Java泛型!

    4.java泛型的限制.zip

    4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip...

    java泛型学习ppt

    java,学习java泛型,java培训之泛型.pptxjava培训之泛型.pptxjava培训之泛型.pptxjava培训之泛型.pptx

    java泛型总结

    深入理解java泛型,包括类名泛型的定义,方法泛型定义,泛型的返回

    SUN公司Java泛型编程文档

    Sun公司的Java泛型编程文档,英文原版和网络翻译版,想对泛型有更清楚的认识的朋友可以看看,必定会有所帮助

    java泛型详解.pdf

    java泛型详解.pdf

    JAVA泛型简单排序实例

    JAVA泛型源代码实现以下功能:返回数组元素的最大值/最小值下标;判断数组元素是否按升序排列;T对象数组排序;二分法查找key元素;

    思维导图之Java泛型详解

    思维导图之Java泛型详解

    Java泛型技术之发展

    Java泛型技术之发展

    JAVA泛型教程(帮你解决学习泛型的苦恼)

    JAVA泛型教程(帮你解决学习泛型的苦恼). Java 泛型编程可能会碰到很多问题,本教程可能会对你有帮助哦。

Global site tag (gtag.js) - Google Analytics