您的位置:首页 > 移动开发 > Objective-C

List<String>不能赋值给List<Object>

2017-06-17 23:40 477 查看
这样写,直接编译报错:
public class Test {
public static void main(String[] args) {
List<String> a = null;
List<Object> bNew = a;//报错
List<Object> cNew = (List<Object>)a;//报错
}
}


通过一个(List<?>)中转一下,然后再强制转换,是可以的:
public class Test {
public static void main(String[] args) {
List<String> a = null;
//List<Object> bNew = a;
List<Object> cNew = (List<Object>) (List<?>) a;
//编译通过,运行正常,不过会有编译器警告。
}
}


使用对象进行测试:
public class Test {
public static void main(String[] args) {
List<String> a = new ArrayList<>();
a.add("HELLO");
//        List<Object> bNew = a;//这句是不通过的
@SuppressWarnings("unchecked")
List<Object> cNew = (List<Object>) (List<?>) a;
System.out.println(cNew.get(0));//正常打印"HELLO"
}
}


原因分析:

1.首先,二者不是父子类关系。

如果是普通的父子类关系,由于Java的多态性,底层的后期绑定机制会在运行时检索子类方法列表,从而实现多态。

2.List<T>属于泛型。(也算是多态的一种)

Java的泛型实现是基于类型擦除的。换句话说,List<String>与List<Object>由于类型擦除,在编译后会映射到相同的List类型上,也就是运行时实际无法区分二者,不过在取用时,编译器会进行类型还原,从而变为原来的List<String>与List<Object>。也就是两者本质上是相同的东西,直接混用会影响类型还原的区分,因此二者不能直接转换。(List<?>)实际是将类型模糊化,然后再具体化的过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息