【问题标题】:ClassCastException when I do ObjectList = StringList当我执行 ObjectList = StringList 时出现 ClassCastException
【发布时间】:2016-07-02 17:46:42
【问题描述】:

我使用 Arrays.asList() 方法和一个字符串创建了列表。 然后我把它分配给List<Object>,我得到了ClassCastException。 我做错了什么?

代码是:

class A {
    Object value;

    public <T> T getAValue() {
        return (T) value;
    }
}

然后我做

A a = new A();
a.value = "abc";

List<Object> list = Arrays.asList(a.getAValue());

【问题讨论】:

  • 你能展示你的代码吗?答案是,“List&lt;String&gt; 不是List&lt;Object&gt;”,但更完整的解决方案还包括帮助您解决所面临问题的方法。
  • 扩展 Makato 所说的,并不是所有的对象都是字符串,所以你会得到一个 ClassCastException
  • @cricket_007:我认为他们试图做的是(List&lt;Object&gt;) someListTypeStringInstance,而不是相反。
  • 目前还不清楚您是如何获得ClassCastException 的。在将List&lt;String&gt; 转换为List&lt;Object&gt; 时,您永远不会得到ClassCastException,因为在运行时没有区别。我们需要查看您的代码!
  • 我认为你需要添加A&lt;T&gt;T value而不是Object value,然后是public T getAValue()和只是return value,然后实例化A&lt;String&gt; a = new A&lt;String&gt;()

标签: java string object arraylist


【解决方案1】:

如果您真的无法在 A 上添加类型信息(即使用 class A&lt;T&gt;),那么一个简单的转换就可以解决您的问题,如下所示 (demo):

A a = new A();
a.value = "abc";
List<Object> list = Arrays.asList((Object) a.getAValue());

这是安全的,因为一切都是Object,但干净的方法是使用A 上的类型信息,如另一个答案所述demo):

A<String> a = new A<String>();
a.value = "abc";
List<String> list = Arrays.asList(a.getAValue());

还请注意,您应该为value 使用setter(即没有a.value = "...")。


部分阅读:https://docs.oracle.com/javase/tutorial/java/generics/

【讨论】:

    【解决方案2】:

    试试这个:

        import java.util.Arrays;
        import java.util.List;
    
        class A<T>{
            T value;
    
            public T getAValue(){
                return value;
            }
    
            public static void main(String... args){
                A a = new A();
                a.value = "abc";
    
                List<Object> list = Arrays.asList(a.getAValue());
                System.out.println(list);
                System.out.println(a.value.getClass());
            }
        }
    

    在声明class A&lt;T&gt; T 的类型绑定到 String 时,请注意通过声明泛型类型 'T' 来简化语法,并且不需要在 getAValue() 中强制转换返回值,泛型会为您处理。

    【讨论】:

    • 为什么在 main 中为 A 使用原始类型?另请注意,评论 A 中所说的 OP 无法修改。
    猜你喜欢
    • 2011-05-23
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2021-08-26
    • 2020-11-30
    • 2019-12-24
    相关资源
    最近更新 更多