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

© 小黑子 中级黑马   /  2014-9-16 19:03  /  2101 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

编译结果如下:
FillDemo.java:22: error: incompatible types: no instance(s) of type variable(s)
T exist so that List<? super T> conforms to ArrayList<String>
                al=fillSome(al,"a",2,4);
                           ^
  where T is a type-variable:
    T extends Object declared in method <T>fillSome(List<? super T>,T,int,int)
1 error

  1. /*
  2. 需求:将List的部分元素替换
  3. */

  4. import java.util.List;
  5. import java.util.ArrayList;
  6. import java.util.Collections;


  7. class FillDemo
  8. {
  9.         public static void main(String[] args)
  10.         {
  11.                 ArrayList<String> al = new ArrayList<String>();
  12.                 al.add("asdf");
  13.                 al.add("asd");
  14.                 al.add("dd");
  15.                 al.add("asdfghoj");
  16.                 al.add("z");
  17.                 al.add("no");
  18.                 System.out.println(al);
  19.                 al=fillSome(al,"a",2,4);
  20.                 System.out.println(al);
  21.         }
  22.         public static<T> List<? super T> fillSome(List<? super T> list,T obj,int fromIndex,int endIndex)//包含头不包含尾
  23.         {
  24.                 if(fromIndex>endIndex)
  25.                         throw new ArrayIndexOutOfBoundsException("Array index out of bounds:"+(fromIndex-endIndex));
  26.                 if(fromIndex>list.size())
  27.                         throw new ArrayIndexOutOfBoundsException("Array index out of bounds:"+fromIndex);
  28.                 if(endIndex>list.size())
  29.                         throw new ArrayIndexOutOfBoundsException("Array index out of bounds:"+endIndex);

  30.                 for(int i=fromIndex;i<endIndex;i++)
  31.                         list.set(i,obj);
  32.                 return list;
  33.         }
  34. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 淡定

查看全部评分

8 个回复

倒序浏览
我的理解 是 你主函数定义 了   ArrayList<String> al      

你返回的list 是    List<? super T>   会有可能类型不匹配   

还有就是你干嘛要返回一个list     直接去掉这一行  再把下面方法设为无返回不就好了  

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 很给力!

查看全部评分

回复 使用道具 举报
谢建平 发表于 2014-9-17 04:11
我的理解 是 你主函数定义 了   ArrayList al      

你返回的list 是    List

我知道返回void就可以,但是,我怕下次碰到必需返回的时候不会写,所以就在这里问问了。
回复 使用道具 举报
T是个未知类型,你? super T,编译器怎么知道T指的是哪个类,又怎么判断你传入的String是不是T的父类呢?
回复 使用道具 举报
函数上是可以定义泛型的,因为你已经把al定义为String泛型了,返回值是父类类型,调用函数时你直接传给了子类类型al是不行的,需要强转,所以报错了
回复 使用道具 举报
fantacyleo 发表于 2014-9-17 17:08
T是个未知类型,你? super T,编译器怎么知道T指的是哪个类,又怎么判断你传入的String是不是T的父类呢? ...

哦,谢谢。那应该怎么改?我这块刚学,不是很明白。。。
回复 使用道具 举报
小黑子 发表于 2014-9-17 20:48
哦,谢谢。那应该怎么改?我这块刚学,不是很明白。。。

只要把T换成一个具体的类,比如Object,就可以了
回复 使用道具 举报
fantacyleo 发表于 2014-9-17 20:54
只要把T换成一个具体的类,比如Object,就可以了

所有的T都要换吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马