`
haofenglemon
  • 浏览: 243046 次
  • 性别: 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

    C++fanxing.rar_fanxing_visual c

    总的来说,"C++fanxing.rar_fanxing_visual c"这个主题不仅涵盖了C++泛型编程的基本概念,也强调了在Visual C++环境下实践这些概念的重要性。通过学习和实践,开发者能够编写出更具通用性和效率的代码,提升软件的可...

    fanxing.rar_泛型

    "fanxing.rar_泛型"这个压缩包文件可能包含了一系列关于C#泛型的练习,旨在帮助学习者深入理解和熟练运用泛型。现在,我们将深入探讨C#泛型的基本概念、优点、类型参数、约束以及如何在实际编程中应用。 首先,泛型...

    fanxing_things_couting_

    标题“fanxing_things_couting_”暗示了我们讨论的主题是关于物品计数或某种算法与数据处理方式,可能涉及到编程中的数组、循环、计数器等概念。描述中的引用"Few things are impossible in themselves; and it is ...

    fanxing.rar

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

    泛型第一个例子

    下面我们将深入探讨泛型的基本概念、用途,以及如何通过给定的`Fanxing.java`和`A.java`文件来理解和应用泛型。 首先,让我们了解泛型的基本概念。泛型是在JDK 5.0中引入的新特性,它的主要目标是提供类型安全,...

    EF增删改查封装基类

    这是我写的Entityframework的增删该查封装基类,如果你要使用EF开发项目,只要把需要增删改查的类继承这个基类,就可以轻松做到。敬请参考,不到之处请多多指正。

    串口通讯协议

    ### 串口通讯协议详解 #### 一、引言 串口通讯作为一种常见的数据传输方式,在许多领域都有着广泛的应用,特别是在工业自动化、嵌入式系统、远程监控等场景中尤为重要。串口通讯的成功实现离不开一系列的技术规范...

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

    在Java编程中,泛型是一种强大的工具,它允许我们在类、接口和方法中定义类型参数,从而实现对多种数据类型的通用处理。泛型的主要目的是提高代码的类型安全性和重用性,减少类型转换的需要,并在编译时捕获可能的...

    C#语法之泛型的多种应用

    gf.FanXingFunc&lt;FanXing&gt;(new FanXing() { Name="Kiba518"});}。 泛型的应用场景 ---------------- 泛型的应用场景非常广泛,例如,在集合类中使用泛型可以提高代码的可重用性和类型安全性。在实际开发中,泛型...

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

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

    gps_demo.rarSTM32接收处理GPS星历

    STM32是一款基于ARM Cortex-M内核的微控制器,广泛应用于嵌入式系统设计,而GPS(全球定位系统)模块则是获取地理位置信息的关键组件。在"GPS_demo.rar"这个项目中,开发者创建了一个示例程序,用于演示如何在STM32...

    对联广告代码

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

    s7200与上位机通讯设置

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

    Somachine 4.1 注册步骤new.docx

    “Somachine 4.1 注册步骤详解” 在本篇文章中,我们将详细介绍 Somachine 4.1 的注册步骤,从邮箱注册到 Somachine 注册的三个大步骤,以及每个步骤中的详细操作。通过阅读本篇文章,读者将了解 Somachine 4.1 ... ... ...

    图书信息管理系统

    图书信息管理系统是一个重要的工具,主要用于图书馆的日常运营和管理,包括图书的查询、借阅、管理及归还等功能。在信息化时代,采用计算机技术来管理图书信息,相比传统的手工方式,具备诸多优势。...

    用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); } }

    STM32ADC理解整理.txt

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

    java 职工管理系统源代码

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

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

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

Global site tag (gtag.js) - Google Analytics