A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 魏明明 黑马帝   /  2012-4-16 17:10  /  1285 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

泛型很好,复写方法时,可以避免强制转换,可是为什么在我复写,ArrayList中的equals方法时,用到泛型,结果不是我所预期的呢

4 个回复

倒序浏览
Java并没有真正实现泛型,是编译器在编译的时候在字节码上做了手脚,这种实现理念造成Java泛型本身有很多漏洞。为了规避这些问题Java对泛型的使用上做了一些约束,但不可避免的还是有一些问题存在。这其中大多数限制都是由类型擦除引起的。
1,不能用类型参数替换基本类型:
  其原因是类型擦除,擦除类型后原先的类型参数被Object或者限定类型替换,而基本类型是不能被对象所存储的。可以使用它们的包装类。

2,运行时类型检查只是针对泛型类的原始类型进行的。getClass()方法只返回原始类型,因为JVM根本就不知道泛型这回事,它只知道原始类型。
  在《Java Core》中提到的
  Pair a = new Pair();
  a instanceof Pair<String>为真的问题在JDK1.6上面已经不存在,这样的语句是通不过检查的,产生一个"instacneof 泛型类型不合法"的错误。
3,不能在静态域或者静态方法中引用类型变量。
4,不能实例化泛型类型。
5,类型擦除后的冲突。例如:
public class B<T>{
    public void fun(T t){ ... }//方法1
    public void fun(Object t){ ... }//方法2
}
这两个方法实际上是冲突的,类型擦除后它们具有相同的签名。

回复 使用道具 举报
有点晕 好深奥
回复 使用道具 举报
equals 别用泛型。。视频中有讲。。这是上帝的方法。你复写最好用(Object obj)   API中也是这样的。
回复 使用道具 举报
上帝不可冒犯。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马