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 中 泛型的限定

泛型 一般 出现在集合中,迭代器中 也会出现!      泛型 是为了 提高代码的 安全性。 泛型 确保数据类型的唯一性。 在我们常用的容器中,  越是 单一 约好处理啊!     ...
  • love_Javc_you
  • love_Javc_you
  • 2014年07月30日 20:41
  • 7666

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

1.泛型参数的限定,使用extends关键字,限定多个类型时用"&"隔开。如: 2.泛型参数限定中,如果限定的类型是class而不是interface,则class必须放在限定类表中的第一...
  • ysjian_pingcx
  • ysjian_pingcx
  • 2014年10月13日 09:42
  • 2453

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

1. 自限定的类型 在java泛型中,经常会出现如下的泛型写法:class SelfBounded SelfBounded类接受泛型参数T,而T由一个边界类限定,这个边界就是拥有T作为其参数的Sel...
  • abc709272013
  • abc709272013
  • 2016年10月24日 22:51
  • 869

Java泛型 类型变量的限定

有时候,类和方法需要对类型变量加以约束,比如你有一个方法,你只希望它接收某个特定类型及其子类型作为参数。 下面就举一个方法限定接收参数的类型的例子来说明如何限定类型变量。 首先有几个简单的辅助类: p...
  • l294265421
  • l294265421
  • 2015年06月08日 15:43
  • 2357

Java泛型类型限定和通配符类型限定

泛型类型变量的限定 泛型的基础知识可以参考其他教程。 如果在方法前指定了,那么就是说,方法的这个泛型类型和类定义时的泛型类型无关,这个特性让泛型方法可以定义在普通类中而不是泛型类中。 我们都知道,泛...
  • gjb724332682
  • gjb724332682
  • 2016年10月17日 18:15
  • 3044

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

【0】README0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 无限定通配符+通配符捕获 的相关知识;【1】无限定通配符相关1.1)无...
  • PacosonSWJTU
  • PacosonSWJTU
  • 2015年12月08日 21:11
  • 1848

Java内部类的全限定名规律

Java内部类的全限定名规律
  • shuzhe66
  • shuzhe66
  • 2014年09月10日 09:26
  • 4797

Java中数组的理解

转自:http://www.blogjava.net/flysky19/articles/92763.html?opt=admin 理解JAVA数组 参考资料: 1.《java jdk5...
  • xgc3098
  • xgc3098
  • 2014年03月21日 11:54
  • 273

JAVA实现图片上传自定义等比尺寸

做了五、六年电子商务开发,电商的商品图片非常的庞大,比如商品的预览图片,最少起码有三种格式,40x40,160x160,250x250,所以很多时候需要对商品图片进行处理,总结下电子商务的图片的储存。...
  • laoshuisheng
  • laoshuisheng
  • 2014年03月29日 10:32
  • 1493

如何限定c++模板的泛化范围(如只…

曾经看到一种说法说c++成也模板,败也模板。我不同意这种说法。因为我觉得模板没有这么重要的地位。模板就和宏一样,有固然方便,没有也就人肉一些,还不至于能够影响一门语言的兴衰。Java能兴起,第一靠库,...
  • runyon1982
  • runyon1982
  • 2015年10月10日 09:21
  • 913
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java 泛型限定
举报原因:
原因补充:

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