济南 网站开发,用ps怎么做网站导航条怎么做,wordpress导购教程,百度竞价推广怎么样当泛型遇到了重载#xff0c;好戏#xff0c;就发生了。
请看下面代码#xff1a; 问题#xff1a;代码能正确编译吗#xff1f;
这个题目是一个考察泛型的题目。java里面#xff0c;泛型实际上是“伪泛型”#xff0c;并不像C#那样是实际上的泛型。
IDE会提示我们下…当泛型遇到了重载好戏就发生了。
请看下面代码 问题代码能正确编译吗
这个题目是一个考察泛型的题目。java里面泛型实际上是“伪泛型”并不像C#那样是实际上的泛型。
IDE会提示我们下面的错误
Method test(List) has the same erasure test(List) as another method in type TR
在java中泛型只存在于源代码之中在编译过后的代码中泛型信息已经被“擦除”了。上面的代码被编译之后的样子应该是下面类似的代码 两个函数具有相同的签名当然编译器会拒绝为我们编译这样的代码。
在java这种伪泛型中List和List**编译之后**是相同的类型。
但是在c#这种真实泛型中上面两个就是不同的类型了。
故事到这里就结束了吗显然没有
------------------------------------昏昏咯咯-------------------------------------
看下面代码 问这段代码能正常编译吗
熟悉class文件结构的人能知道这段代码能正常编译重载成功了。而且还能正常执行呢 代码输出
integer
string疑问来了。jvm规定函数的返回值并不参与“函数签名”的生成那么仅仅改变了函数返回值从而让不能编译的代码通过了编译并且能正常执行了这不是很矛盾吗
原因在于虽然函数的返回值不参与函数签名的生成但是在class文件中只要描述符不完全一致的两个方法就能共存于一个class文件中。
【java代码中函数的特征签名仅仅包括方法名称、参数类型以及参数顺序。但在字节码中特征签名还包括了方法的返回值以及受查异常表这就是为什么在class文件中其他都相同仅仅返回值不同的两个方法能共存的原因】