java泛型list
1. java一个泛型数组List<> 怎么复制某几行到另外一个List<>
你明白一个单纯的“?”是什么意思吗?它代表的是任意类型。既可以是有继承关系的,也可以是八竿子都打不到的。比如你想写的大约是这样的class gen{pulbic <? extends Number>void listMove(List <?>list1 , List<?> list2,Int i){list2.add(list1.get(i));}}但是请注意这里?号代表的是任意一个Number的子类,这意味着你如果传入像list1 是List<Long>而list2是List<Double>这样的同级泛型参数,就像这样来调用这个函数list1 = new List<Long >();list2 = new List<Double>();listMove(list1, list2, i);这个函数的目的显然是把list1 的第i个元素放入list2中,但是请注意list1和list2是不相同,也没有继承关系的同级别类型,你正试图把一个Long 类型放入一个只能够放置Double类型的List 中,如果java允许你这样来操作元素,那不是和泛型本身希望提高类型安全的目的背道而驰了吗?这个问题里你需要注意的是,想要传递的类型参数是有关系的,lIst1的?号应该是list2的本身或者子类才对,你应该这样定义你的方法,你需要对这两个?号有一定的约束这样来定义public < T extends Object>/*这里可以是你自己对类型的约束,我都是约束成了Object的*/void listMove(List<? extends T> list1//有条件的约束,?应该是T的子类, List<T> list2 ,int i){
list2.add(list1.get(i));
}
2. JAVA 泛型。为什么List < extends Number> list 只能添加null
很简单啊,因为泛型上界List <? extends Number> list;这种只能作用在引用上,表示这个引用可以指向new List<Number>()或者new List<Integer>(),但是无论怎么指向,实际指向的对象都必须有具体且单一的类型。
//B是C和D的基类,C和D都继承于B
List<?extendsB>b;
List<C>c=newArrayList<>();
c.add(newC());
b=c;//b引用可以指向c
b.forEach(System.out::println);//正常打印
//-----------------------------
List<D>d=newArrayList<>();
d.add(newD());
b=d;//也可以指向d
b.forEach(System.out::println);//正常打印
//上面的指向的对象都是具体的类型
b=newArrayList<?>();
b=newArrayList<?extendsB>();
//上面两个提示通配符?无法直接实例化
//下面这个提示类型不匹配
b=newArrayList<Object>();
3. 关于java泛型集合转换问题,下图是List<String>类型数据,求问怎么转换为List<T>类型
public class Test {
public static void main(String[] args){
List<A> list = new ArrayList<A>();
A a1 = new A("101","01","122222222","上海");
A a2 = new A("102","02","133333333","南京");
A a3 = new A("103","03","142333223","上海");
A a4 = new A("104","04","125555552","上海");
list.add(a1);
list.add(a2);
list.add(a3);
list.add(a4);
}
}
class A{
private String ID;
private String num;
private String iphone;
private String address;
public String getID() {
return ID;
}
public void setID(String iD) {
ID = iD;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public String getIphone() {
return iphone;
}
public void setIphone(String iphone) {
this.iphone = iphone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public A(String id,String num,String iphone,String address){
this.ID = id;
this.num = num;
this.iphone = iphone;
this.address=address;
}
}
我写了个例子,应该能明白了吧?也就是吧你集合的数据封装成一个对象,这样泛型的时候就可以泛型成这个对象了。A也就是你说的T 这样就是你要的把数据封装成了A类对象
希望能帮到你!
4. java泛型 List<String>[] list=new ArrayList[10]; list[1].add("abc");//空指针异常,这是为什么
1 import java.util.*;
2 public class Fanxing{
3 public static void main(String args[]){
//初始化一个数组长度为10。里面每的一个类型为List<String>类型
4 List<String> list[]=new ArrayList[10];//使用ArrayList初始化长度为10(因为List是接口所以只能使用其子类初始化,初始化就是指定数组长度)的数组,或者理解为创建长度为10的数组。
//为数组中第2个变量赋初值。
5 list[1]=new ArrayList();
//操作该初值,初值为List链表,操作链表为链表增加一个值;
6 list[1].add("sss");//增加String正确
7 list[1].add(new Integer(10));//增加Integer错误,证明第6行的List<String>对list[]变量的泛型约束有效
8 String s=list[1].get(0);//没有报类型转换错误,同样证明第6行的List<String>对list[]变量的泛型约束有效
9 System.out.println(s);
}
}
/**
*第7行就是指定一个数组的长度,数组的初始化,是固定写法,不可以写作 new ArrayList<String>();之所以有这个数组初始化的另类,是因为sun要告知Java程序员泛型并不存在于JVM。
*总结 语法规则:数组的初始化的含义即指定数组的长度,需要注意的是泛型类型的数组初始化必须使用自然类型。sun是为了告知Java程序员泛型并不存在于JVM
*/
5. 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咯)
6. JAVA中List泛型和ArrayList泛型的关系和区别
List是一个接口 ArrayList是LIst接口下的一个实现类
List<UserVo> list = new ArrayList<UserVo>();
子类的对象动态的指向父类
这样的好处是
ArrayLIst可以随便改变实现类 而list对象不用变
比如
List<UserVo> list=new LinkedList<UserVo>();
7. 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.调试过我就明白了,一开始我也那么想.
8. java 泛型list如何遍例
这里不是个二维数组,是个list
你可以这样遍历
for(int i=0;i<a.size();i++){
Object o =(Object) a.get(i);
}
9. java泛型方法可以返回 List<T> 吗
可以!!返回值必须是你定义的类型包含的泛型也必须一样
10. java 泛型 List 怎么当做函数的传递参数
你想把e1 当参数。那么你List<Entity1> e1=new ArrayList<Entity1>();//定义为全局变量
然后
public void updateEntity1(e1);//调用就可以了
{