`
richie.lee
  • 浏览: 29391 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

一个有趣的泛型问题

阅读更多

 

Object obj = new Test();
//下面这行可以成功编译
((Test)obj).getClass().newInstance().func();

//下面这两行无法通过编译
/*Class c = ((Test)obj).getClass();
c.newInstance().func(); */

 原因有点巧妙:

JAVA定义Object.getClass为 public final Class<? extends Object> getClass()

Class.newInstance()定义为:

public T newInstance() throws InstantiationException,IllegalAccessException

 

所以((Test)obj).getClass()返回的结果是Class<? extends Test> ,所以,第一种情况认为T是Test类型,可以通过编译。

而第二种情况,其实我们将Class<? extends Test>进行类型转换了,使得变量c的实际类型是Class<?>,所以T没有办法确定是哪种类型,造成编译不通过!

分享到:
评论

相关推荐

    j2ee泛型和反射有趣的集合

    例如,当我们声明一个`List&lt;String&gt;`,编译器就会确保我们只能添加String类型的对象到列表中。然而,由于Java的类型擦除,泛型在运行时并不保留类型信息,因此在运行时,所有的泛型集合都会退化为`List&lt;Object&gt;`。 ...

    实验报告 程序设计方法学 C++ STLJava泛型程序设计

    - 这是一个有趣的递归函数,对于任何输入n,如果n &gt; 100,则返回n - 10;否则返回f(n + 11)。 - **Ackermann函数** - Ackermann函数是一个双参数递归函数,其增长速度非常快,常用于测试递归算法的效率。 ##### ...

    Generic in java programming language

    在使用泛型时,如何处理非泛型化的“遗留”代码也是一个重要问题。 ##### 在泛型代码中使用遗留代码 当需要在泛型环境中调用非泛型化的方法时,可以通过显式类型参数的方式来进行转换。例如: ```java public ...

    C++技能百练各种有趣的程序.rar

    C++标准库是一个强大的工具集,包含了容器(如vector、list、set)、算法(如排序、查找)和迭代器等。熟悉并能熟练运用这些库是提高编程效率的关键。在这些有趣的程序中,你可能会遇到使用STL解决实际问题的例子。 ...

    VC++的27个有趣的程序 供初学者

    "VC++的27个有趣的程序 供初学者"这个资源正提供了这样一个机会,让学习者能够在实践中深化对VC++的理解。 1. **基础概念**:VC++不仅包括了C++语言,还集成了Microsoft Foundation Classes (MFC),这是一个用于...

    一个C#做的电脑蓝屏模拟代码

    【标题】:“C#实现的电脑蓝屏模拟代码”是一个有趣的编程项目,旨在为程序员们在愚人节提供一种幽默的互动方式。通过利用C#编程语言,开发者能够创建一个程序,模仿计算机出现著名的“蓝屏死机”现象,但请注意,这...

    有趣的C++程序实例

    "有趣的C++程序实例"这一资源为你提供了全面深入理解C++语言的机会。这个压缩包包含27个精心设计并已调试成功的程序,覆盖了C++的多个核心概念,旨在帮助你通过实践来增强理论学习。以下是这些实例可能涉及的一些...

    数据结构中线性表的应用,约瑟夫环算法 便于数据结构的学习.zip

    在本压缩包中,我们主要探讨的是线性表的应用以及一个有趣的算法——约瑟夫环算法。 线性表是由n(n≥0)个相同类型元素构成的有限序列,可以顺序存储或链式存储。顺序存储的线性表通常用数组实现,操作简单,但...

    读取一个用户名(假设为接收祝福的人),然后输出个性化的520节日祝福

    本教程将通过一个简单但有趣的案例——"读取一个用户名并输出个性化520节日祝福",来展示Rust的基本用法和编程思路。520在中国网络文化中代表着“我爱你”,因此这个小项目能帮助我们学习如何利用Rust与用户交互,...

    dotnet-programming-training:此解决方案包括用于试用C#功能和解决问题的各种项目。 当我发现一些有趣的问题时会更新

    总之,"dotnet-programming-training"是一个深入学习和实践C#编程,特别是多线程和泛型特性的宝贵资源。它不仅提供了理论知识,还包含了丰富的实践案例,是提升C#技能的理想选择。无论是初学者还是经验丰富的开发者...

    GeniusOrIdiotQuiz:关于棘手问题的有趣测验

    标题 "GeniusOrIdiotQuiz" 提供的信息表明,这是一个基于棘手问题的测验应用或游戏,可能设计用于挑战用户的智力和解决问题的能力。而"有趣"一词暗示了这不仅仅是一个严肃的知识测试,还包含了娱乐元素,让用户在...

    一个C#实现的数据结构动画演示系统.zip

    总的来说,这个C#实现的数据结构动画演示系统是一个强大的学习工具,它将理论与实践相结合,使得数据结构的学习变得更加生动有趣。无论你是正在学习数据结构的大学生,还是希望提高编程技能的专业人士,这个资源都将...

    C++语法分析器-英文版

    通过对C++模板的形式化描述,我们发现了C++标准中的两个有趣问题:第一个问题是成员实例化的问题;第二个问题涉及到不必要的模板特化生成。这些问题揭示了C++标准中可能存在的潜在缺陷,需要进一步的研究和修正。 #...

    穷举法 三八二十四

    “三八二十四”的标签进一步强调了这个问题的特殊性质,即它可能是一个有趣的数学游戏或编程练习,目的是通过实际操作来理解和掌握穷举法的运用。提供的压缩包文件名“三八二十四”可能包含的就是上述的源代码文件...

    C++陷阱小品-有趣易懂

    引用在C++中是一种特殊的变量类型,它像一个别名,总是指向另一个对象。一旦引用被初始化,就不能改变它指向的对象。使用引用可以避免拷贝大对象的开销,也可以确保函数不会修改原始数据。 6. **构造函数与析构...

    Java谜题,java中的有趣的解谜

    Java作为一个广泛应用的面向对象编程语言,它的谜题往往涉及到类与对象、多线程、异常处理、内存管理等多个方面。通过对这些谜题的解答,我们可以更深入地理解Java的工作原理,提升编程技能。 1. **类型转换**:...

    俄罗斯娃娃问题

    总的来说,"俄罗斯娃娃问题"是一个有趣的抽象概念,它展示了如何将现实世界的问题转化为计算机科学中的算法和数据结构。通过掌握递归、泛型和集合操作等C#核心概念,开发者可以有效地解决这类问题,并在实际项目中...

Global site tag (gtag.js) - Google Analytics