一道反射和泛型的面试题

              面试题目大概如下:

                            现在有Class A 有三个成员 a,b,c.及其get,set方法。。。。

                            再有一泛型类 Class Test<T>  里面有一方法public T buildClass(Map map);

                            map传入的参数是class A 成员的实例数据{a=>1,b=>2,c=>3}

                            问能否通过 buildClass方法进行实例话A,即A=new Test<A>().buildClass(map);

 

             一开始我完全没有思路,心想,buildClass完全没提供类的信息给我,我怎么去实例化A类.

            后来面试官见我茫然,提供下思路:泛型是在编译的时定就确定类型,反射的调用是在运行时。

   并提供可以先找到buildClass的返回类型再实例化。当我高兴的顺着这个思路下去的时候,面试官

   来了句,实际并不可行。。然后就略过了这面试题了。。

          

           回到家,对这个理论和实际冲突的现象,百思不得其解。。肯定哪个环节出现了问题。然后动手自己分析。

    一开始我先否定了结论,buildClass是可以实现的。经过我百度,用T extends abc (abc是抽象类),都无法实现.

          然后在一次的调试中   System.out.println(this.getClass().getDeclaredMethods()[1]);

          出现结果是:public java.lang.Object ddddd.Test.buildClass(java.util.Map)

          因此有个大胆的猜想:泛型是在编译的时定就确定类型,这句话中的类型,起了疑心,这个确定的类型并不是运行时

   new Test<abc>().buildClass(new HashMap());的abc类型,而是Test<T>,T所能确定的第一个父类,例Test<T extend  abc>

         T就在编译时会被编译成Test<abc>,如果 Test<T>,则是Test<Object>

        

        带着这个问题去用javap -verbose 反编译下Class文件. 

       

 

        再看看 T extend abc

      

   

     

        所以结论:public T buildClass(Map map); 我们是无法获取到类型参数的。迷雾已解开。。。

  

 

 

<think>首先,用户查询是关于TypeScript相关的面试题目及解答。我需要基于系统指令用户可见层的指导来构建回答。 系统指令: - 所有行内数学表达式用$...$格式。 - 独立公式用$$...$$并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识,如[^1]。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠。 - 参考提供的引用内容。 提供的引用: - [^1]: 关于TypeScript面试题总结,包括类系统、接口、等。 - [^2]: 包含TypeScript面试题,如对象等。 - [^3]: TypeScript高频面试题及解析,提到类声明推断。 用户查询:查找TypeScript相关的面试题目及解答。 我需要构建一个结构清晰的回答: 1. **介绍**:简要解释TypeScript是什么,为什么重要。 2. **列出常见面试题**:提供几个相关的面试题。 3. **提供答案解析**:对每个题目给出详细解释代码示例。 4. **生成相关问题**:在结尾添加相关问题。 5. **引用标识**:在引用的地方添加引用标识。 由于引用是站内提供的,我需要从中提取相关内容: - 引用[1]提到是核心知识点之一。 - 引用[2]提到"对象"。 - 引用[3]讨论类声明推断,可能与相关。 在TypeScript中用于创建可重用的组件,可以处理多种数据类。常见面试题可能包括: - 什么是? - 的好处是什么? - 如何使用函数、接口、类? - 约束是什么? - 与any的区别? 我将基于知识创建合理的题目解答。引用[2]提到"11.对象",所以我应该包括类似内容。 结构回答: 1. **引言**:介绍在TypeScript中的重要性。 2. **常见面试题及答案解析**:列出3-5个题目,每个题目包括问题、解释、代码示例。 3. **总结**:简要总结的关键点。 4. **相关问题**:生成相关问题。 确保使用中文回答。 添加引用标识:在引用参考内容的地方添加,如基于引用[1]或[2]。 代码示例用代码块格式,如示例中所示。 数学表达式:如果涉及数学,用LaTeX格式。TypeScript可能不直接涉及数学,但如果有类似概念,用$...$。 生成相关问题:在结尾添加"相关问题"部分。 最终回答框架: - 开头:解释。 - 主体:列出题目解答。 - 结尾:相关问题。</think>### TypeScript 常见面试题及答案解析 TypeScript 是核心知识点之一,它允许创建可重用的组件,通过类参数化来处理多种数据类,提高代码的灵活性安全性。广应用于函数、接口、类别名中,避免使用 `any` 类带来的风险。以下是基于站内引用内容整理的常见面试题及详细解析,每个题目包含解释代码示例,帮助您系统准备面试[^1][^2]。 #### 1. 什么是 TypeScript ?它的主要优势是什么? **问题解析**:此问题考察对基本概念的理解。(Generics)是一种编程范式,允许在定义函数、接口或类时使用类变量(如 `T`),在调用时指定具体类。这避免了硬编码类,提升代码复用性。 **优势**: - **类安全**:编译时检查类错误,减少运行时错误。 - **代码复用**:一个组件可处理多种数据类。 - **避免 `any` 滥用**:提供类约束,而 `any` 会丢失类信息[^1][^3]。 **代码示例**: ```typescript // 函数示例:交换两个值 function swap<T>(a: T, b: T): [T, T] { return [b, a]; } const result = swap<number>(1, 2); // 正确:result 类为 [number, number] // const error = swap<number>(1, "hello"); // 编译错误:类不匹配 ``` #### 2. 如何使用约束(Generic Constraints)?举例说明。 **问题解析**:约束用于限制类参数必须满足特定条件,例如实现某个接口或拥有某些属性。通过 `extends` 关键字实现,确保类安全。 **关键点**: - **约束语法**:`<T extends ConstraintType>`。 - **应用场景**:当需要访问特定属性或方法时[^2]。 **代码示例**: ```typescript // 定义接口作为约束 interface Lengthwise { length: number; } // 函数:获取对象长度,约束 T 必须实现 Lengthwise 接口 function getLength<T extends Lengthwise>(obj: T): number { return obj.length; } const str = getLength("hello"); // 正确:string 有 length 属性 const arr = getLength([1, 2, 3]); // 正确:数组有 length 属性 // const num = getLength(10); // 编译错误:number 没有 length 属性 ``` #### 3. 接口类有什么区别?如何应用? **问题解析**:此问题比较在不同结构中的应用。接口定义可重用的类契约,而类用于创建可实例化的对象模板。两者都通过类参数提高灵活性。 **区别**: - **接口**:用于类声明,不能被实例化。 - **类**:可实例化,常用于封装数据逻辑[^1][^2]。 **代码示例**: ```typescript // 接口示例:定义键值对 interface KeyValuePair<K, V> { key: K; value: V; } // 使用接口 const pair: KeyValuePair<string, number> = { key: "age", value: 30 }; // 类示例:简单仓库类 class Storage<T> { private data: T[] = []; addItem(item: T) { this.data.push(item); } getItem(index: number): T { return this.data[index]; } } // 使用类 const numberStorage = new Storage<number>(); numberStorage.addItem(10); console.log(numberStorage.getItem(0)); // 输出: 10 ``` #### 4. 与 `any` 类的主要区别是什么?为什么推荐使用? **问题解析**:此问题考察与 `any` 的对比,强调类安全的重要性。`any` 会绕过类检查,而保留类信息。 **区别**: - **`any` 类**:动态类,编译时不检查,可能导致运行时错误。 - ****:静态类,编译时验证类,提高可靠性[^3]。 **代码示例**: ```typescript // 使用 any:无类安全 function identityAny(arg: any): any { return arg; } const outputAny = identityAny("hello"); // 编译通过,但 outputAny 类为 any,可能出错 // 使用:类安全 function identity<T>(arg: T): T { return arg; } const outputGeneric = identity<string>("hello"); // 编译通过,outputGeneric 类为 string ``` #### 总结 是 TypeScript 的核心特性,通过类参数化提升代码的可维护性扩展性。掌握函数、约束、接口类,能有效应对大项目开发。在实际面试中,重点展示代码示例安全优势[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值