① java中list的泛型问题
是的
上面是ArrayList的get方法,返回时是强转了
如果不指定泛型就是Object类型的,如果指定了泛型,类型不对的话你put都put不进去的
② 根据不同的参数list怎么返回不同的泛型结果
首先你得明白,Java里面泛型的用处,Java为了变量能在虚拟机(JVM)中合理分配并高效实用内存,才出了泛型这个东东。
你的意思应该是如果一个方法返回的是处理结果是List<String>,那么获得了方法的值直接是List<String>,不用强制转换就能实用;如果返回的是List<Map>,那么同样获得返回值就是List<Map>类型,也不用强转对吧?
如果是这样,你的想法就目前的JDK版本来说是实现不了的。
建议你还是返回Object类型,然后强转吧。
如果你使用Object作为返回值,你可以创建单独的数据类型检测方法做做强制类型转换。
不要偷懒哦:-)
③ 请教java List 泛型转换
如:List<String> list = new ArrayList<String>(); list.add("1");
list.add("2");
采用泛型写法后,list想加入一个Integer类型的对象时会出现编译错误,通过List<String>,直接限定了list集合中只能含有String类型的元素,从而在后续如果进行for循环就无须进行强制类型转换,因为此时,集合能够记住元素的类型信息,编译器已经能够确认它是String类型了。
④ java泛型的一些疑问
重点在
publicclassBeanListHandler<T>implementsIResultSetHandler<List<T>>
IResultSetHandler<List<T>>
来看IResultSetHandler的定义
<T>
你就可以看到定义中<>内就是泛型T,而实现IResultSetHandler时<>内的是List<T>。
所以呢对于IResultSetHandler接口来说,List<T>就是这个泛型对象,所以最后返回的也是一个list。
如果两个相同的T对你产生了干扰,你可以把其中一个T改成K、V等等。
比如这样
<K>{
Khandler(ResultSetset)throwsException;
}
这样就更好理解了,实现类的List<T>就是K,返回的K就是返回List<T>
⑤ java 方法中如何在返回类型使用泛型
主要是一个编译期的检查,也避免了我们代码中的强制转换,比较经典的用法有泛型DAO,泛型Page的DTO。
现在我要说的是一个挺有趣但是貌似还不是太多的人在代码中使用的方法,前段时间用guava和op4j的时候发现这样的用法,看看了源码,也是很简单的。
比如guava中创建集合的方法 List<xx> list = Lists.newArrayList(),这个代替了我们传统的 new ArrayList<xx>,为什么在=的右边不需要泛型了呢,我们看看源码。
[java] view plain
public static <E> ArrayList<E> newArrayList() {
return new ArrayList<E>();
}
返回类型中带有泛型E,并且这个泛型的来源在 static和 ArrayList之间的位置,我自己的理解是这个就和=左边的一致,可能说的不够专业但是意思应该就这样。
于是我就依样画葫芦在自己的代码中也用了起来。
我要做的是一个仿httpsession机制的自定义协议是session。在httpsession.getAttribute方法返回的是一个
Object,然后我们再类型转换。现在我用返回类型泛型来优化这个代码,以下是我自定义协议session的getAttribute的代码。
[java] view plain
@SuppressWarnings("unchecked")
public <E> E getAttribute(String key) {
return (E) map.get(key);
}
调用代码
[java] view plain
Boolean isFirst = session.getAttribute("first");
在httpsession中我们则要这么写
[java] view plain
Boolean isFirst = (Boolean)session.getAttribute("first");
泛型的用法还有很多,有新的心得再补充更新
⑥ java中泛型List问题
您好,我用断点调试解释吧[真的很高兴能与你讨论][啊啦上回不好意思但还是说对一部分滴].
1-----你在go方法中,没有给list限制泛型约束,所以1.1不加check的存储进arraylist了.
2-----"1.1"是被内部机制转换为Double存储进arraylist的:
[在System.out.println(list.get(1));处下断点,点调试.可以看到list里是
[1, 1.1],
elementData[]为
[1, 1.1, null, null, null, null, null, null, null, null].
elementData[0]的值是"1",
elementData[1]的值为Double (标识=37).]
也就是说,go方法add时因为没有约束,所以由内部机制将1.1转换为Double存入了以String为约束的list里.
3-----点"单步跳入",看到代码跳到了arraylist的get里:
public E get(int index) {
RangeCheck(index);
return elementData[index];
}
关键点就在这了,由第2步看到elementData[1]的类型为Double,而在main里为list设置的约束是String,所以E 为String.上面的代码就变为:
public String get(int index) {
RangeCheck(index);
return 1.1; //double
}
继续跳,
看到他照样返回了一个加着String标签的double值.
4-----继续点然后报错了.这个是由于syso输出是输出String.这个后面会说.
如果你加一个方法:
public static void go1(List list)
{
System.out.println(list.get(1));
}
这样没约束的情况下syso,是没有错的.因为get后的对象没有加类型标签,会由内部机制判断他到底是哪个类.
而加了String返回类型标签后就不做判断直接调用syso(String)的方法来输出Double了.所以报告了class cast错误.
如果你继续看,会看到是String类的init出现的错误.
因为前面调试中看到syso(args)的args为String[],而返回的却是Double.类型没匹配上.
正确的那个例子不用说了吧,调试一下会发现他syso时String.valueof(obj)了,"1.1"肯定满足条件.[如果不满足条件,会打印object,这也是能输出syso(list)的原因][SYSO在控制台输出的是字符,如果是double会转为字符输出]
而错的那个因为返回标明了是String,所以程序不加判断就直接write了,输出字符却给个double,就出错了.
上班了...打一中午,555,可能说的有错误,楼主自己调试一下,以自己的方式理解一下吧>_<
PS:其实俺上回说的有一部分对...我楼上那位5级大哥说的也部分对,但1.1是double传进去的,没转换成int.调试过我就明白了,一开始我也那么想.
⑦ java泛型List<>用法
1.1 list.get()返回类型为?,所以你只能用Object接收,Object足以确保type-safe,因为java中任何class都是Object的subclass。(当然,如果你非要使用类型强制转换,转换成什么阿猫阿狗的class,也没人拦得住你,对此只能说“编译器尽力了,你行你上啊”,反正ClassCastException什么的最有爱了)
2.2 list.put()除了null以外,任何参数都不接收。这也足以确保list中类型的type-safe,要知道,java的泛型的implementation是基于ERASURE(擦除)的,举个具体的例子,LinkedList<E>的内部数据结构肯定是基于Node<E>,那么一个Node有2个field,E element和Node<E> next,而实际上在runtime环境中,LinkedList<String>中的Node并不是Node<String>,仅仅是Node,Node里面的element的类型也不是String,仅仅是Object,也就是说,compile-time的type-information都被抹除了(Quote: For backward-compatibility)。试想这么一个情景,Tom传了一个List<Dog>给Mike,Mike的interface是List<?>,Mike往list中放了一个Cat(假设compiler没有阻止Mike),然后Tom取出该List中所有的object并当成Dog使用(compiler会自动加上类型转换的代码——which is how java generics worked),然后Tom就悲剧地得到了一个ClassCastException——这就是为什么除了null其他参数都不接收的原因——阻止Mike随便放东西进去。
2、List
raw-type就是这么个情况,相当于你对compiler说:“我并不在乎这个List里面的element的runtime-type是什么,不管我怎么操作这个list或者list中取出来的object,你都别管,实在看不过去就给我个warning就行了”。这种情况下:
2.1 list.get()返回类型为Object,当然,也是type-safe的(如果你不强制转换的话)
2.2 list.put()的参数类型为Object,也就是说,你爱往里面放什么object就放什么object,还是上面那个例子,就算Tom给Mike的是List<String>,但由于Mike的interface是List,所以Mike放个BigInteger甚至什么Cat、Dog,compiler都不会阻止Mike(但是,要知道,Mike是无法得知其他人会怎么使用这个List的,比如说Mike无法得知Tom相信编译器确保了list中的object都是String,但是由于Mike的raw-type interface,Tom就难免吃ClassCastException咯)
⑧ JAVA中的泛型用法一种: <T> 返回值用法。
1、对于泛型方法来说,是可以接收不同类型的参数,比如下图,使用泛型来操作List集合,然后向List中添加一条数据,看是否可以添加成功,创建泛型方法如图所示。
⑨ JAVA 定义方法里,前面是list类型,那么返回应该是什么
这个方法应该返回list塞,,
把log对象放到list中,然后返回list就OK 。
这样放。
ArrayList list=new ArrayList();
while(rs.next()){
log=new Log();
log.setId(rs.getInt(1));
log.setLog_title(rs.getString(2));
log.setLog_content(rs.getString(3));
log.setLog_date(rs.getDate(4));
log.setRemark(rs.getString(5));
list.add(log);//把log放到list.
}
return list;
⑩ java泛型方法可以返回 List<T> 吗
答案是肯定的!
publicclassDemo01<E>{
privateList<E>list=newArrayList<E>();
publicList<E>store(E[]arr){
list=Arrays.asList(arr);
returnlist;
}
publicstaticvoidmain(String[]args){
Demo01<String>d=newDemo01<>();
Stringanimals[]={"Cat","Dog","Pig","Monkey"};
List<String>list=d.store(animals);
for(Stringstring:list){
System.out.print(string+" ");
}
}
}