有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

泛型转换如何在Java中工作

如果我声明一个我碰巧知道的列表“myList”只包含字符串,我可以将其转换为一个列表而不会出现任何问题,那么在幕后将列表转换为一个字符串列表究竟是怎么回事

List myList = new ArrayList();
List<String> myStringList = (List<String>) myList;

如果我将列表创建为对象列表,我会假设同样的事情也适用,但我不能再将其转换回字符串列表,这是什么原因

List<Object> myObjList = new ArrayList<Object>();
List<String> myStringList = (List<String>) myObjList; // Can't do this!

共 (3) 个答案

  1. # 1 楼答案

    从技术上讲,通过@FunctionR添加一个子句来回答

    Strings are Objects but Objects are not Strings
    

    但是Objects可以是String

    ObjectString的基类。所以你可以双向施放

    比如

    Object a = null;
    String s = "";
    
    a = s;
    s = (String)a;
    

    所以String可以是Object

    但是在{}和{}

    你应该这么做

    List<Object> myObjList = new ArrayList<Object>();
    List<String> myStringList = (List) myObjList;
    
  2. # 2 楼答案

    List myList = new ArrayList();
    List<String> myStringList = (List<String>) myList;
    

    出于与前泛型代码兼容的原因而工作。它可以工作,但如果原始List不仅包含Strings,它可能会在运行时给您带来错误

    泛型应该在编译时保护你。它们不允许您将list of Objects强制转换为list of String,因为List<Objects>可能包含不属于String的对象,并且会在运行时导致错误

  3. # 3 楼答案

    字符串是对象,但对象不是字符串,这就是为什么不能执行第二个代码

    我喜欢这样想:狗是一种动物,可以表现得像动物,但动物不是狗

    好消息