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没有办法确定是哪种类型,造成编译不通过!
分享到:
相关推荐
例如,当我们声明一个`List<String>`,编译器就会确保我们只能添加String类型的对象到列表中。然而,由于Java的类型擦除,泛型在运行时并不保留类型信息,因此在运行时,所有的泛型集合都会退化为`List<Object>`。 ...
- 这是一个有趣的递归函数,对于任何输入n,如果n > 100,则返回n - 10;否则返回f(n + 11)。 - **Ackermann函数** - Ackermann函数是一个双参数递归函数,其增长速度非常快,常用于测试递归算法的效率。 ##### ...
在使用泛型时,如何处理非泛型化的“遗留”代码也是一个重要问题。 ##### 在泛型代码中使用遗留代码 当需要在泛型环境中调用非泛型化的方法时,可以通过显式类型参数的方式来进行转换。例如: ```java public ...
C++标准库是一个强大的工具集,包含了容器(如vector、list、set)、算法(如排序、查找)和迭代器等。熟悉并能熟练运用这些库是提高编程效率的关键。在这些有趣的程序中,你可能会遇到使用STL解决实际问题的例子。 ...
"VC++的27个有趣的程序 供初学者"这个资源正提供了这样一个机会,让学习者能够在实践中深化对VC++的理解。 1. **基础概念**:VC++不仅包括了C++语言,还集成了Microsoft Foundation Classes (MFC),这是一个用于...
【标题】:“C#实现的电脑蓝屏模拟代码”是一个有趣的编程项目,旨在为程序员们在愚人节提供一种幽默的互动方式。通过利用C#编程语言,开发者能够创建一个程序,模仿计算机出现著名的“蓝屏死机”现象,但请注意,这...
"有趣的C++程序实例"这一资源为你提供了全面深入理解C++语言的机会。这个压缩包包含27个精心设计并已调试成功的程序,覆盖了C++的多个核心概念,旨在帮助你通过实践来增强理论学习。以下是这些实例可能涉及的一些...
在本压缩包中,我们主要探讨的是线性表的应用以及一个有趣的算法——约瑟夫环算法。 线性表是由n(n≥0)个相同类型元素构成的有限序列,可以顺序存储或链式存储。顺序存储的线性表通常用数组实现,操作简单,但...
本教程将通过一个简单但有趣的案例——"读取一个用户名并输出个性化520节日祝福",来展示Rust的基本用法和编程思路。520在中国网络文化中代表着“我爱你”,因此这个小项目能帮助我们学习如何利用Rust与用户交互,...
总之,"dotnet-programming-training"是一个深入学习和实践C#编程,特别是多线程和泛型特性的宝贵资源。它不仅提供了理论知识,还包含了丰富的实践案例,是提升C#技能的理想选择。无论是初学者还是经验丰富的开发者...
标题 "GeniusOrIdiotQuiz" 提供的信息表明,这是一个基于棘手问题的测验应用或游戏,可能设计用于挑战用户的智力和解决问题的能力。而"有趣"一词暗示了这不仅仅是一个严肃的知识测试,还包含了娱乐元素,让用户在...
总的来说,这个C#实现的数据结构动画演示系统是一个强大的学习工具,它将理论与实践相结合,使得数据结构的学习变得更加生动有趣。无论你是正在学习数据结构的大学生,还是希望提高编程技能的专业人士,这个资源都将...
通过对C++模板的形式化描述,我们发现了C++标准中的两个有趣问题:第一个问题是成员实例化的问题;第二个问题涉及到不必要的模板特化生成。这些问题揭示了C++标准中可能存在的潜在缺陷,需要进一步的研究和修正。 #...
“三八二十四”的标签进一步强调了这个问题的特殊性质,即它可能是一个有趣的数学游戏或编程练习,目的是通过实际操作来理解和掌握穷举法的运用。提供的压缩包文件名“三八二十四”可能包含的就是上述的源代码文件...
引用在C++中是一种特殊的变量类型,它像一个别名,总是指向另一个对象。一旦引用被初始化,就不能改变它指向的对象。使用引用可以避免拷贝大对象的开销,也可以确保函数不会修改原始数据。 6. **构造函数与析构...
Java作为一个广泛应用的面向对象编程语言,它的谜题往往涉及到类与对象、多线程、异常处理、内存管理等多个方面。通过对这些谜题的解答,我们可以更深入地理解Java的工作原理,提升编程技能。 1. **类型转换**:...
例如,一个谜题可能涉及到Scala的类型推断机制,展示了一个可能导致类型错误的代码片段,让读者思考为什么编译器会产生这样的结果。答案可能涉及类型擦除、泛型边界或者隐式转换的复杂交互。另一个谜题可能关于函数...