黑马程序员技术交流社区

标题: 这个函数的返回类型应该怎么写? [打印本页]

作者: 小黑子    时间: 2014-9-16 19:03
标题: 这个函数的返回类型应该怎么写?
编译结果如下:
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. }
复制代码




作者: 谢建平    时间: 2014-9-17 04:11
我的理解 是 你主函数定义 了   ArrayList<String> al      

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

还有就是你干嘛要返回一个list     直接去掉这一行  再把下面方法设为无返回不就好了  
作者: 小黑子    时间: 2014-9-17 16:50
谢建平 发表于 2014-9-17 04:11
我的理解 是 你主函数定义 了   ArrayList al      

你返回的list 是    List

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

哦,谢谢。那应该怎么改?我这块刚学,不是很明白。。。
作者: fantacyleo    时间: 2014-9-17 20:54
小黑子 发表于 2014-9-17 20:48
哦,谢谢。那应该怎么改?我这块刚学,不是很明白。。。

只要把T换成一个具体的类,比如Object,就可以了
作者: 小黑子    时间: 2014-9-17 22:06
fantacyleo 发表于 2014-9-17 20:54
只要把T换成一个具体的类,比如Object,就可以了

所有的T都要换吗?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2