`
haofenglemon
  • 浏览: 245812 次
  • 性别: 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站课程的来敲的,比较浅,只做个人的笔记使用,方便自己进行相应的回顾(因在学习过程没有命名好文件夹名和文件名)...

    基于Spring Boot的fanxing-security-spring-boot-starter权限校验与安全框架设计源码

    该项目为基于Spring Boot框架构建的轻量级安全框架fanxing-security-spring-boot-starter源码,包含25个文件,主要由22个Java源文件组成,并辅以1个LICENSE文件、1个Markdown文件和1个XML配置文件。该框架专注于权限...

    泛型第一个例子

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

    EF增删改查封装基类

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

    串口通讯协议

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

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

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

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

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

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

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

    s7200与上位机通讯设置

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

    Somachine 4.1 注册步骤new.docx

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

    java 职工管理系统源代码

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

    用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的计算和外部硬件的连接,都有介绍

    对联广告代码

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

    gps_demo.rarSTM32接收处理GPS星历

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

Global site tag (gtag.js) - Google Analytics