-1

我有一个 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 */}

你能解释一下为什么字符对象不被转换成字符串吗?

4

4 回答 4

1

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

此外,{转换Character不是关于铸造,而是关于自动装箱/拆箱。

于 2013-01-28T06:24:16.497 回答
0

char原始类型,但String对象

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

于 2013-01-28T06:25:15.397 回答
0

您声称正在使用泛型做某事,因此不清楚您为什么要施放任何东西。

话虽如此,您说您正在使用 typeCharacter并且从堆栈跟踪和您的第一个示例看来stak.head确实是 type Character

您不能将其转换为String; 它不是一个。就这么简单。这两个类没有任何关系。你的第二个例子是完全多余和不必要stack.head Character

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

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

的内容自动拆箱stack.head为a然后与. 单引号表示文字。char'{'char

于 2013-01-28T06:39:09.507 回答
0

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

这是因为 Character 不是从 String 扩展而来的

很可能您应该使用的是DequeStack 的自定义实现而不是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
于 2013-01-28T06:41:22.030 回答