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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张洪慊 高级黑马   /  2013-4-12 19:46  /  959 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张洪慊 于 2013-4-14 01:06 编辑
  1. package test;
  2. import java.util.*;

  3. class Animal{
  4. private String name;
  5. Animal(String name){

  6. this.name=name;

  7. }
  8. public String getName(){
  9.    
  10.   return name;

  11. }
  12. }
  13. class Pig extends Animal{
  14.   Pig(String name){
  15.    super(name);
  16. }
  17. }
  18. class Bird extends Animal{
  19.   Bird(String name){
  20.    
  21.         super(name);
  22.   
  23.   }


  24. }


  25. class Demo{
  26.         
  27.         public static void main(String[] args){
  28.       
  29.           TreeSet<Pig>ts1 = new TreeSet<Pig>(new Com());
  30.            ts1.add(new Pig("P1"));
  31.            ts1.add(new Pig("P2"));
  32.          
  33.           TreeSet<Bird>ts2 = new TreeSet<Bird>(new Com());
  34.            ts2.add(new Bird("B1"));
  35.            ts2.add(new Bird("B2"));

  36.            method(ts1);
  37.            method(ts2);
  38.            
  39.    
  40.         }

  41.     /*
  42.         构造函数:
  43.         TreeSet(Comparator<? super E> comparator)
  44.         例如:E为Pig
  45.              TreeSet(Comparator<? super Pig> comparator)
  46. 对于以上其可传入类型为:Comparator<Pig>或Comparator<Animal>或Comparator<Object>
  47. 当传入Comparator<? super Pig>=new Com()时,new Com()为原始类型的对象,为什么不会发出警告?
  48. */

  49.          public static <T extends Animal> void method(TreeSet<T> ts ){
  50.          
  51.             for(Iterator<T>it=ts.iterator();it.hasNext();){
  52.            
  53.             System.out.println(it.next().getName());
  54.            }
  55.          }
  56. }


  57. class Com implements Comparator<Animal>{

  58. public int compare(Animal a1,Animal a2){


  59.   return a1.getName().compareTo(a2.getName());

  60. }


  61. }
复制代码
为此写个小程序 模拟下:
  1. class Father<T>{
  2.   T str;

  3. }
  4. class Son extends Father<Integer>{//传递一个实参Integer
  5.                                   //为了测试

  6. public void method(Father<String> t){
  7. System.out.println(str);
  8. }

  9. public static void main(String[] args){

  10. new Son().method(new Father<String>());//可以Father<String> t=new Father<String>();
  11.   new Son().method(new Son());//编译失败,无法Son 转换成 Father<String>(无法通过方法调用转换将实际参数Son转换为Father<String>)
  12.                                                   //(Father)new Son() ->强制类型提升->仅仅发出警告,为什么?

  13. }
  14. }
复制代码
对以上略作修改:
  1. class Father<T>{
  2.   T str;

  3. }
  4. class Son extends Father<String>{//改为<String>
  5.                                   //为了测试

  6. public void method(Father<String> t){
  7. System.out.println(str);
  8. }

  9. public static void main(String[] args){

  10. new Son().method(new Father<String>());//可以Father<String> t=new Father<String>();
  11.   new Son().method(new Son());//正常,没有警告, Father<String> t =new Son( ),为什么不会发出警告呢?和Comparator例子很类似.
  12.                                                   //如果在这里也强制类型提升(Father)new Son()->编译会发出警告
  13. }
  14. }
复制代码
希望能够针对以上例子,详细分析下.

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

1 个回复

倒序浏览
各种百度提问,CSDN提问0.0,没人回答- - 唉.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马