将对象转换为字符串v / s将对象转换为字符

时间:2013-01-28 06:22:13

标签: java object casting

我有一个Stack的通用实现。此Stack的一个对象的名称为stak,类型为Character

我试过

if ( ( ((String)(stak.head).equals("{")) && (str.charAt(i)=='}') )  { /* do something */}

代码编译正确,但它在运行时给出了以下错误:

Exception in thread "main" java.lang.ClassCastException: java.lang.Character can
not be cast to java.lang.String
        at One.main(One.java:36)

但是,以下代码有效:

if ( ((Character)(stak.head) == '{') && (str.charAt(i)=='}') )  { /* do something */}

您能否解释为什么角色对象不会被转换为String?

4 个答案:

答案 0 :(得分:1)

仅仅因为Character不是String,不属于公共层次结构,因此不允许转换。您可以尝试将List转换为ArrayList,因为编译器知道它们共享一个公共继承树。另外,如果你有一个Stack的通用实现,你真的不应该依赖这样的具体类型,所以我想知道你的代码中有什么。

另外,{ 转换Character不是关于投射,而是关于自动装箱/拆箱。

答案 1 :(得分:0)

char 原语,但字符串对象

char 必须传递给构造函数才能创建 String 类型的对象。 (投射不会创建对象)

答案 2 :(得分:0)

你声称对Generics做了一些事情,因此不清楚为什么要投射任何东西。

话虽如此,你说你正在使用类型Character,并且从堆栈跟踪和第一个示例看来,stak.head确实属于Character类型。

你不能把它强加给String;它不是一个。就这么简单。这两个类彼此无关。您的第二个示例完全是多余的,因为stack.head Character

编辑添加:还值得一提的是Character是Java中的一个特殊类,它是原始char的包装器。当你说

if (stack.head == '{' ... ) 

stack.head的内容自动取消装箱char,然后与'{'进行比较。单引号表示char字面值。

答案 3 :(得分:0)

Can you please explain why doesn't the character object get cast into String?

这是因为Character不会从String

扩展

您应该使用的是Deque而不是Stack的自定义实现或java.util.Stack

示例代码可以防止您看到的问题:

    Deque<Character> charStack = new ArrayDeque<>();
    charStack.addFirst('A');
    charStack.addFirst('B');
    System.out.println(charStack.pop()); //prints B
    charStack.addFirst("C"); //Avoids the String trap with a compilation error