`
haofenglemon
  • 浏览: 240790 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

fanxing

    博客分类:
  • user
阅读更多
1.<? extends Class>是一种限制通配符类型,它可以接受所有<Class>以及Class的子类型。然而调用代价是,只读访问。
2.TClass<T>
{
T obj;
}
这个T是不能拿来实例化对象的,只能用来进行转型,和限定参数类型和返回类型。
3.关于静态方法的泛型
public static <T> T gMethod (List<T> list) { ... }
public class Circle {
    public static <T> T gMethod(List<T> list) {
       System.out.println("come here");
       return list.get(0);
    }
    public static void main(String args[]) {
       List<Person> pl = new LinkedList<Person>();
        pl.add(new Person("sharkmao",622));
       Person p = Circle.gMethod(pl);
    }
}

4.一个BT的语法
<T extends Object & Comparable<? super T>>
T  max (Collection<? extends T> coll) {}
C++中的泛型已经相当恶心了,没有想到java中的泛型也没有好到哪里去。
T必须实现Comparable接口,而且Comparable接口比较的类型必须是T的超类
public abstract class Shape implements Comparable<Shape>{}
LinkedList<Shape> sList = new LinkedList<Shape>();
Shape s = Collections.max(sList);
之所以比较的是Shape的超类,是因为這是合理的,因为不知道比较出来的结果会是Rect或Circle或Stroke但无论如何它们都可以向上转型为Shape。



下面说说java泛型中擦拭这个概念。
import java.lang.reflect.ParameterizedType;

import java.lang.reflect.Type;



import junit.framework.TestCase;



class TClass<T> {

}



class GoodClass<T> extends TClass<String> {

    public ParameterizedType getClassT() {

       return (ParameterizedType) getClass().getGenericSuperclass();

    }

}



class BadClass<T> extends TClass<T> {

    public ParameterizedType getClassT() {

       return (ParameterizedType) getClass().getGenericSuperclass();

    }

}



public class GenericsTest extends TestCase {



    private void print(Type[] targs) {

       System.out.print("actual type arguments are:");

       for (int j = 0; j < targs.length; j++) {

           System.out.print(" instance of " + targs[j].getClass().getName()

                  + ":");

           System.out.println(" (" + targs[j] + ")");

       }

    }



    public void testGoodClass() throws Exception {

       ParameterizedType type = new GoodClass<String>().getClassT();

       Type[] types = type.getActualTypeArguments();

       print(types);



       assertEquals(TClass.class, type.getRawType());

       assertEquals(String.class, types[0]);

    }



    /*public void testBadClass() throws Exception {

       ParameterizedType type = new BadClass<String>().getClassT();

       Type[] types = type.getActualTypeArguments();

       print(types);



       assertEquals(TClass.class, type.getRawType());

       assertEquals(String.class, types[0]);

    }*/

}





注意GoodClass和BadClass唯一的不同就是在继承的时候一个指定了父亲的类型是String,而另一个没有指定父亲的类型。

但是测试testBadClass方法会失败。

下面是一段对擦拭这个概念阐述的一段话

实际上BadClass<String>()实例化以后Class里面就不包括T的信息了,对于Class而言T已经被擦拭为Object。而真正的T参数被转到使用T的方法(或者变量声明或者其它使用T的地方)里面(如果没有那就没有存根,这里指ParameterizedTyp),所以无法反射到T的具体类别,也就无法得到T.class。
而getGenericSuperclass()是Generic继承的特例,对于这种情况子类会保存父类的Generic参数类型,返回一个ParameterizedType,这时可以获取到父类的T.class了,这也正是子类确定应该继承什么T的方法。
我们应该利用这种特性,这对实现模版方法非常有用。

就我目前的理解,一个使用了泛型的类是无法得到自己的T.class的,只有它的子类在继承的时候,为父类指定T的类型(当然父类中有Class<T>clazz这个属性),然后子类中就才可以获得并且使用这个类型。



后来看了一些对java泛型的评论

Java的范型实现来自于一个叫做Pizza的项目。后来呢改名叫做GJ,再后来通过JSR被融合进Java语言。由于Java的范型实现中有一个重要的设计目标,即使范型实现能够运行于现有的、未经修改的JVM上。不修改JVM当然看上去很美,但也会带来一大堆稀奇古怪的限制。
Java的范型中,得不到一般范型实现所能获得的执行效率上的提高。原因在于Java中的范型类在编译时,编译器会将类型参数替换回object。为了讨 JVM的欢心,编译器自动加入了你并没有写过的类型转换操作。因此你得到的仅仅是语法上的甜头,而没有获得执行效率的提高。这是一个问题。
第二个问题,也是更严重的问题是,Java的范型实现在运行时偷换了编译时的实际类型,当你对一个范型的List使用反射功能时,你可不知道这个List是个什么类型的List。由于失去了类型信息,动态代码生成功能和反射功能都没法使用。只能在接口中多一个Class参数用来指明类型了。


分享到:
评论

相关推荐

    fx_fanxing_star_full_41_1.png

    fx_fanxing_star_full_41_1.png

    fanxing.rar

    Java泛型学习源码————B站Java学习笔记之泛型的相关笔记(含源码),里面的代码只是简单的照着B站课程的来敲的,比较浅,只做个人的笔记使用,方便自己进行相应的回顾(因在学习过程没有命名好文件夹名和文件名)...

    C++fanxing.rar_fanxing_visual c

    上海交大上课用的VC++程序2 上 海交大上课用的VC++程序2

    fanxing.rar_泛型

    c#泛型练习,c#泛型练习,c#泛型练习,c#泛型练习,

    fanxing_things_couting_

    Few things are impossible in themselves; and it is often for want of will

    串口通讯协议

    刚了解串口通讯或者开发串口通讯的开发,这个文档从全局很好的介绍串口通讯,值得一看。

    JAVA利用泛型返回类型不同的对象方法

    下面小编就为大家带来一篇JAVA利用泛型返回类型不同的对象方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    酷狗短址生成工具-crx插件

    语言:中文 (简体) 酷狗短址生成工具,能将包含kugou.com及fanxing.com的域名缩短,并生成短链接 酷狗短址生成工具,能将包含kugou.com及fanxing.com的域名缩短,并生成短链接

    java 职工管理系统源代码

    java 职工管理系统源代码 用的数据库是sql server 2005

    gps_demo.rarSTM32接收处理GPS星历

    本程序是STM32对于GPS模块的星历接收处理问题。其中包括了对GPS模块星历的接收以及处理。并把UTC、定位状态、经纬度都等都做了接收存储。

    图书信息管理系统

    图书信息管理系统是一个图书馆不可缺少的管理工具,它能够实现图书的查询、借阅、管理、归还等操作。 使用计算机对图书信息进行管理,具有手工管理所无法比拟的优点,如检索迅速、查找方便、可靠性高、存储量大、...

    用C语言写的快速排序1.c

    void quicksort(int a[], int p, int r) { if(p){ int q = partition(a,p,r); quicksort(a,p,q-1); quicksort(a,q+1,r); } }

    对联广告代码

    主要用于网站首页的宣传广告,需要用的Dreamweaver软件进行编辑

    s7200与上位机通讯设置

    上位机与西门子200PLC远程通讯方案,设置方法

    Somachine 4.1 注册步骤new.docx

    Somachine 4.1 注册步骤new.docx

    STM32ADC理解整理.txt

    STM32 ADC的使用问题 对于如何使用ADC 包括ADC的计算和外部硬件的连接,都有介绍

    IATF Rules 5th CN版(第五版).pdf

    该认可规则由国际汽车工作小组(IATF)发布于2016年11月1日,本《 IATF 16949汽车认证方案》“获得并保持IATF认可的规则”在本文中被称为“第五版规则”,取代“第四版规则”以及在本文件发布之前发行的所有相关规则...

Global site tag (gtag.js) - Google Analytics