先看例子:

  1. import java.util.*;
  2.  
  3. class Fruit { public String toString() { return "Fruit"; } }
  4.  
  5. class Apple extends Fruit { public String toString(){ return "Apple"; } }
  6.  
  7. class Person { public String toString(){ return "Person"; } }
  8.  
  9. class ClassName<T> {//主类,文件名ClassName.java
  10.  
  11. void show_1(T t){
  12. System.out.println("show_1 "+ t.toString());
  13. }
  14.  
  15. <E> void show_2(E e){
  16. System.out.println("show_2 "+e.toString());
  17. }
  18.  
  19. <T> void show_3(T t){
  20. System.out.println("show_3 "+t.toString());
  21. }
  22.  
  23. public static void main(String[] args) {
  24. ClassName<Fruit> o = new ClassName<Fruit>();
  25. Fruit f = new Fruit();
  26. Apple a = new Apple();
  27. Person p = new Person();
  28. System.out.println("show_1 演示________________________");
  29. o.show_1( f );
  30. o.show_1( a );
  31. // o.show_1( p ); 这行代码是不能编译通过的。因为在
  32. // ClassName<Fruit>中已经限定了全局的T为Fruit,所以不能再加入Person;
  33. System.out.println("show_2 演示________________________");
  34. o.show_2( f );
  35. o.show_2( a );
  36. o.show_2( p );
  37. System.out.println("show_3 演示________________________");
  38. o.show_3( f );
  39. o.show_3( a );
  40. o.show_3( p );
  41.  
  42. }
  43. }

程序输出:

  1. show_1 演示________________________
  2. show_1 Fruit
  3. show_1 Apple
  4. show_2 演示________________________
  5. show_2 Fruit
  6. show_2 Apple
  7. show_2 Person
  8. show_3 演示________________________
  9. show_3 Fruit
  10. show_3 Apple
  11. show_3 Person

show_2 和show_3方法其实是完完全全等效的。意思就是说ClassName<T>中一旦T被指定为Fruit后那么show_1没有前缀<T> 的话,该方法中只能是show_1 (Fruit对象)

要是有前缀<T>或<E>的话,那么就是告诉编译器:这是新指定的一个类型,跟ClassName<T>类对象中的T没有半毛钱的关系。也就是说这个show_3中的T和show_2中的E是一个效果,也就是可以把show_3同等程度地理解为<E> void show_3(E e){~~~~~}

摘自:泛型里面的<T> List<T>前面的<T>代表是什么意思?为什么要加<T>?

随机推荐

  1. ContentResolver + SqliteOpenHelper + ContentProvider 理解

    惭愧,现在才接触到ContentResolver的用法 这个类主要是Android用来实现应用程序之间数据共享的 一个应用程序可以将自己的数据完全暴露出去,外界更本看不到,也不用看到这个应用程序暴露的 ...

  2. Android Widget(窗口小部件)

    Android Widget简介 应用程序窗口小部件(Widget)是微型的应用程序视图,它可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新.你可以通过一个App Widget Provide ...

  3. MVC4中使用SignalR

    MVC4中使用SignalR 前言 周末在偶尔翻阅微软官网的时候看到Getting Started with SignalR and MVC 4此篇文章,知道了signalr这个东西,貌似这个出来很长 ...

  4. listView 分页加载数据

    Android应用 开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过分页 的形式来展示数据,个人觉得这样会有 ...

  5. Linux内核 hlist_head/hlist_node结构解析

    内核中的定义: struct hlist_head {    struct hlist_node *first;}; struct hlist_node {    struct hlist_node ...

  6. JVM内存模型及垃圾收集策略解析(一)

    JVM内存模型是Java的核心技术之一,之前51CTO曾为大家介绍过JVM分代垃圾回收策略的基础概念,现在很多编程语言都引入了类似Java JVM的内存模型和垃圾收集器的机制,下面我们将主要针对Jav ...

  7. HTML <form> 标签的 enctype 属性

    HTML <form> 标签 定义和用法 enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码. 默认地,表单数据会编码为 "application/x-www- ...

  8. Java之路——Java初接触

    本文大纲 1.Java是什么 2.Java历史 3.Java技术范围 3.1 Java SE平台技术范围 3.2 Java EE技术范围 3.3 Java 体系技术范围 4.总结 1.Java是什么 ...

  9. 前端工具 - 15个最佳的 JavaScript 表单验证库

    客户端验证在任何项目都是不够的,因为 JavaScript 可以直接忽略,人们可以提交请求到服务器. 然而这并不意味着客户端验证都没必要了,很多时候我们需要在用户提交到服务器之前给予提示.JavaSc ...

  10. jdk 安装配置

    在windows上配置JDK 1.下载windows版JDK 网址:http://www.oracle.com/technetwork/java/javase/archive-139210.html ...