java中泛型怎么强制转换

Python018

java中泛型怎么强制转换,第1张

首先你的问题得明确一些

如果把List<B>转成B,则不用转,直接B b = list.get(2)。

如果把List<B>转成A,也不需要强制转换,因为A是B的父类。父类的引用可以直接指向之类的对象,而不需要强制转换。A a = list.get(2)就可以完成。

如果把List<A>转成B,这需要强制转换。也很简单B b = (B)list.get(2)但是,前提是,当你把对象装入List<A>list的时候,你必须实例化B对象,否则会报错

以下是第三种不会报错情况的代码,比较简陋,但运行正确,分析原理足矣!

package a

import java.util.ArrayList

import java.util.List

public class A {

public int sign = 1

public List<A>getList(){

List<A>l = new ArrayList<A>()

for(int i=0i<5i++){

l.add(new A(i))

}

return l

}

public A(int s){

this.sign = s

}

}

package a

import java.util.ArrayList

import java.util.List

public class B extends A {

public B(int s) {

super(s)

// TODO Auto-generated constructor stub

}

/**

* @param args

*/

public static void main(String[] args) {

B b = new B(1)

List<A>list = b.getList()

for(int i=0i<5i++){

A a = list.get(i)

B bb = (B)list.get(i)

System.out.println("A:"+a.sign+" B:"+bb.sign)

}

}

public List<A>getList(){

List<A>l = new ArrayList<A>()

for(int i=0i<5i++){

l.add(new B(i))

}

return l

}

}

楼主可以把B中的new B(i)改成new A(i) ,编译不报错,运行就会错了!

如:List<String>list = new ArrayList<String>()list.add("1")list.add("2")采用泛型写法后,list想加入一个Integer类型的对象时会出现编译错误,通过List<String>,直接限定了list集合中只能含有String类型的元素,从而在后续如果进行for循环就无须进行强制类型转换,因为此时,集合能够记住元素的类型信息,编译器已经能够确认它是String类型了。