我有一个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?
答案 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