Java 泛型限定

原创 2016年08月28日 21:27:30

泛型

泛型类

        public class Person<T>{
            private T data;

            public T get(){
                return data;
            }

            public void add(T data){
                this.data = data;
            }
        }

如果希望限定传入这个Person的泛型形参为某个类型或者他的子类:

        public class Person<T extends Number>{
            private T data;

            public T get(){
                return data;
            }

            public  void add(T data){
                this.data = data;
            }
        }
        //这样是用这个Person类的时候就必须是Number类或者其子类

泛型方法:

泛型方法的定义格式

    [public|private] <K,V> 返回值 方法名(K k,V v){}

类型推断:

用户不需要传入一个类型参数,编译器会自动推断参数的类型来决定泛型的类型,原则是能是赋值正确的最具体的泛型类型

            public <T> abc(T a,T b){}
            abc(32,32.0); // 此时T被编译器推断为Double类型
            abc(32,new Object()); // 此时T被推断为Object

泛型限定:

通配符:

    1. <?>
    2. add方法会出错,get方法获取的对象没有编译时类型
         public  void testGet(List<?> list){
            String str = list.get(0);//出错,因为返回值没有编译时类型
            System.out.println(str);
        }
        public  void testAdd(List<?> list){
            list.add(new Object());//出错,因为你永远不知道传入的list是什么类型,所以给他添加一个具体的类型都是不对的
            System.out.println(str);
        }

上限限定:

        public void upperBound(List<? extends Date> list){
            Date date = new Date();
            list.add(date);//这一句话会出错,原因是传入的list可能泛型参数为Date的子类,当把一个父类Date赋值给子类就会导致出错
            Date d = list.get(0);     //这句话不会出错,因为我已经知道list里面的元素类型一定是Date类型或者其子类,
                                      //所以把一个Date类型或者其子类的对象赋值给Date类型绝对不会出问题
        }

下限限定:

        public void lowerBound(List<? super TimeStamp> list){
           TimeStamp ts = list.get(0);//这一句话会出错,原因是传入的list可能泛型参数为TimeStamp的父类,哪父类的对象赋值给子类当然是不行
           list.add(new TimeStamp());//这句话是对的,因为已知add的形式参数类型肯定是TimeStamp及其父类,把一个子类对象赋值给父类当然可行
        }        

易错点:

泛型之间没有继承关系List<String> ls = new ArrayList<Object>(); // 这是不可以的
但是List<String> ls = new ArrayList<String>();                 //是可以的
List<Object>  lo = new ArrayList<Objct>();
 lo.add("hello world");                                         //这也是没有错误的,因为add的参数类型是Object
List<String>  ls = new ArrayList<String>();
lo.add(new Object());                                         //这会粗错
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

java编程思想读书笔记 第十五章 泛型(自限定的类型)

1. 自限定的类型 在java泛型中,经常会出现如下的泛型写法:class SelfBounded<T extends SelfBounded> SelfBounded类接受泛型参数T,而T由一个边...

java泛型程序设计——无限定通配符+通配符捕获

【0】README0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 无限定通配符+通配符捕获 的相关知识;【1】无限定通配符相关1.1)无...

java集合(泛型向(上下)限定

/*  * 泛型的限定:  * 1.向上限定:可以接收E类型或者E的子类型。  */ import java.util.*; public class GennericDemo6 { pu...

Java泛型解析(02):通配符限定

1.泛型参数的限定,使用extends关键字,限定多个类型时用"&"隔开。如: 2.泛型参数限定中,如果限定的类型是class而不是interface,则class必须放在限定类表中的第一...

JAVA——泛型限定(占位符)

?通配符。也可以理解为占位符。 泛型的限定: ?extends E: 可以接受E类型或者E的子类型。上限 ?super E: 可以接收E类型或者E的父类型。下限 import java.u...

java泛型程序设计——通配符类型+通配符的超类型限定

【0】README0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 通配符类型+通配符的超类型限定 的知识;【1】通配符类型相关1.1)通...

Java中的泛型

  • 2016-10-22 12:08
  • 4.37MB
  • 下载

Java 实现泛型List

  • 2014-08-16 22:24
  • 13KB
  • 下载

java泛型程序设计——类型变量限定 + 泛型代码和虚拟机

【0】README0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 类型变量限定 + 泛型代码和虚拟机 的知识;【1】类型变量的限定1.1...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)