Java 中对于泛型方法的定义:

public <T> T getT(){

  .....相关代码;

}

其中我对<T>的理解就是申明只是一个泛型方法的标记,T是返回的类型。

对于泛型类的定义:

public class Type<T>{

  ....相关代码

}

上面写的是关于泛型方法和泛型类的定义。这里写这篇博客的主要目的是为了记录<? extends T> 和 <? super T>的理解。

<? extends T>是上界通配符。逻辑上来说,一个可以往里面放动物的容器,也可以往里面放狗,因为狗是继承了动物的,所以从

逻辑上来说,一个可以放狗的容器也应该是继承一个可以放动物的容器的。但是Java中这是不对的。这时候就需要上界通配符来解决这个问题。

可以定义一个Content<? extends Animal> content,这个content容器里面可以放任何Animal包括其子类。这使得容器Content之间也有

了一定的联系。但是其中的也有一定的副作用。Content类里面有个getContent()方法,这个方法是不会影响使用的。因为对java编译器来说,

里面所有的东西都有一个相同的父亲,那就是Animal。但是如果你想要使用setContent()方法,这时就会出现一个问题,问题是什么呢?那就

是我只知道里面的类型是Animal以及Animal的派生类,但是无法确定具体的类型,是Dog或者Cat等。这里的类型没有具体给明,所以编译器

在这里只是给了一个占位符,所以到后面往t里面放Dog或者Apple的时候他都不知道是不是和Animal相匹配,所以这是不允许使用set的。下面

方法中的 public void setContent(List<T> content) 如果想可以set T包括T的子类的List的时候,可以这么定义:

public void setContent(List<?extends T> content)。

<? super T>是下界通配符。其作用这好和上面的<? extends T>相反。Content<? super Animal> content 表示的是Animal 以及Animal

基类的容器,但不是Dog基类的容器。里面的setContent()方法是可以正常使用的。因为它规定了最小粒度的下限,那就是Animal。但是它往外面

getContent()就比较费劲,因为他们公共的基类只有Object。所以取出来的内容只能用Object来装。

所以这里总结了一点就是如果一个内容他需要set的内容比较多,那就使用<? super T>。如若使用get的多一点,那就使用<? extends T>。

下面是自己定义的一个Content类:

  1. package test;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5. import java.util.List;
  6.  
  7. public class Content<T> {
  8. private String contentName;
  9. private List<T> content;
  10. private T t;
  11. private int size;
  12. public Content(){
  13. content = new ArrayList<T>();
  14. size = 0;
  15. }
  16. public String getContentName() {
  17. return contentName;
  18. }
  19. public void setContentName(String contentName) {
  20. this.contentName = contentName;
  21. }
  22. public List<T> getContent() {
  23. return content;
  24. }
  25. @SuppressWarnings("unchecked")
  26. public void setContent(List<? extends T> content) {
  27. this.content = (List<T>) content;
  28. }
  29. public void add(T content){
  30. this.content.add(content);
  31. }
  32. public void getInfo(){
  33. System.out.println(content.toString());
  34. }
  35. public int getSize(){
  36. size = content.size();
  37. return size;
  38. }
  39. public T getT() {
  40. return t;
  41. }
  42. public void setT(T t) {
  43. this.t = t;
  44. }
  45. public void remove(int pos){
  46. this.content.remove(pos);
  47. }
  48. public T get(int i){
  49. if(i>content.size())
  50. return null;
  51. return content.get(i);
  52. }
  53. }

定义的Animal类:

  1. package test;
  2.  
  3. public class Animal {
  4. private String type;
  5. private String describe;
  6. public Animal(){
  7.  
  8. }
  9. public Animal(String type,String describe){
  10. this.type = type;
  11. this.describe = describe;
  12. }
  13. public String getType() {
  14. return type;
  15. }
  16. public void setType(String type) {
  17. this.type = type;
  18. }
  19. public String getDescribe() {
  20. return describe;
  21. }
  22. public void setDescribe(String describe) {
  23. this.describe = describe;
  24. }
  25.  
  26. }

继承Animal的Dog类

  1. package test;
  2.  
  3. public class Dog extends Animal {
  4. private String name;
  5. private int age;
  6. public Dog(String type,String describe,String name,int age){
  7. super(type,describe);
  8. this.name = name;
  9. this.age = age;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. public int getAge() {
  18. return age;
  19. }
  20. public void setAge(int age) {
  21. this.age = age;
  22. }
  23.  
  24. }

Java泛型的定义以及对于<? extends T>和<? super T>的更多相关文章

  1. JAVA泛型知识(二)--> <? extends T>和<? super T>

    <? extends T> 和 <? super T> 是Java泛型中的“通配符(Wildcards)” 和 “边界(Bounds)”的概念 <? extends T& ...

  2. JAVA泛型中的有界类型(extends super)(转)

    JDK1.5中引入了泛型(Generic)机制.泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Ja ...

  3. 泛型的上下边界 : ? extends E 与 ? super T

    public class Problem { public static void main(String[] args) { List<? extends A> list; List&l ...

  4. JAVA泛型知识(一)

    Java泛型知识(二)<? extends T>和<? super T> Java1.5泛型指南中文版(Java1.5 Generic Tutorial) 目        录 ...

  5. Java泛型 通配符? extends与super

    Java 泛型 关键字说明 ? 通配符类型 <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类 <? super T> 表示类型下界(Java ...

  6. Java泛型主题讨论

    说明:在学习泛型这一知识点中,主要参考自<疯狂Java讲义>第7章P307-P330的泛型内容,因为是跳着阅读,所以前面的一些名词不是特别清楚,这里也做出适当备注,供自己识记与理解. 1. ...

  7. Java泛型和集合之泛型VS模板

    Java的泛型很像C++中的模板,说到Java 泛型和C++中的模板的关系时,有两个重要的方面需要被考虑到:语法和语义.语法看起来是相似的,可是语义却明显是不同的. 在语法上讲,选择尖括号  是因为他 ...

  8. 浅谈Java泛型之<? extends T>和<? super T>的区别

    关于Java泛型,这里我不想总结它是什么,这个百度一下一大堆解释,各种java的书籍中也有明确的定义,只要稍微看一下就能很快清楚.从泛型的英文名字Generic type也能看出,Generic普通. ...

  9. 浅谈Java泛型中的extends和super关键字(转)

    通配符 在本文的前面的部分里已经说过了泛型类型的子类型的不相关性.但有些时候,我们希望能够像使用普通类型那样使用泛型类型: 向上造型一个泛型对象的引用 向下造型一个泛型对象的引用 向上造型一个泛型对象 ...

随机推荐

  1. CentOS6.8使用源码安装Git

    一.安装git所需的依赖 sudo yum groupinstall "Development Tools" sudo yum install gettext-devel open ...

  2. 通过VS2010命令提示窗口创建强命名文件时报错问题

    问题描述详见图 解决方案 00000005意思是Access Denied(即拒绝访问). 原因是:Program Files(x86)目录对一般用户和未提升权限的管理员是只读的. 所以只要赋予Use ...

  3. VS调试技巧与快捷键&&VS快捷键

    VS调试技巧与调试快捷键 1.添加断点或取消断点:F9(或者点击代码行最左边的灰色行)   2.调试:F10逐过程(不进入函数内部,直接获取函数运行结果)  F11逐语句(会进入函数),如果想跳出函数 ...

  4. 64位下Hook NtOpenProcess的实现进程保护 + 源码 (升级篇 )

    64位下Hook NtOpenProcess的实现进程保护 + 源码 (升级篇 ) [PS: 如果在64位系统下,出现调用测试demo,返回false的情况下,请修改Hook Dll的代码] glhH ...

  5. A2D规则引擎

    A2D规则引擎 写了个简单的规则引擎,普通情况够用了: 比如2家公司有各自的利率计算规则,如下: 在C#方面,没有写在C#的业务逻辑代码中,而是移到了外部规则文件中,如(ACompanyRatePol ...

  6. 自定义生命周期的设计(iOS篇)

    自定义生命周期的设计(iOS篇) 首先要确定一点,我们的App,要基于XIB文件进行编程,而不是在每个相应的ViewController里面去手动创建页面的每个控件.这样做的好处是,将页面布局与业务逻 ...

  7. ibatis配置log4j输出sql日志信息

    为了在开发过程更加直观,我们需要将ibatis日志打开以便观察ibatis运作的细节. ibatis采用Apache common_logging,并结合Apache log4j作为日志输出组件. 在 ...

  8. jquery validate 验证

    JSP中引入 <link href="themes/gray/easyui.css" rel="stylesheet" type="text/c ...

  9. 解决GOOGLE不能用的办法

    解决GOOGLE不能用的办法 首先平时用用百度还是足够了,但是说实话,百度在进行一些尝试搜索时真的没GOOGLE好用,经常找到一大堆广告,却不是自己想要的,比如搜索里面的双引号.and.site.fi ...

  10. 我的Pandas应用场景(2)

    上文交代了一些啰嗦事,本文开始,就要来点实际的了. 先来一个比较简单的场景: Given:一个包括N(极其复杂,这里取3个)个列的DataFrame:df,df包括index: And:对df所有列元 ...