无法转换为char in? :运营商

时间:2016-02-20 11:06:20

标签: java char

我想给用户2个选择,无论是用字母还是数字读取节点。它会说“从节点A到B”或“从节点1到2”。所以我编写了类似// 2代码的代码(我想让它变得简单,所以我让条件为“真”)。但结果是“66”而不是“B”。但是,// 1代码工作正常。我怎样才能编写代码,允许我按照我想要的方式更改字母和显示?感谢。

System.out.println(true?(char)(65+1):65);//1

int a=65;
System.out.println(true?(char)(65+1):a);//2

结果

B
66

*尽量让它更清晰:我想制作一个循环打印出来

From node A to node B
From node A to node C
From node A to node D
...

所以我会写

for (int i=1;i<26;i++)System.out.println("From node A to node "+ (char)(65+i));

但如果用户决定:

,我也希望能够打印出来
From node 1 to node 2
From node 1 to node 3
From node 1 to node 4
...

因此,我提出了一个关于用户想要的格式作为布尔format变量的问题。我编辑代码

boolean format=true;//I simplify it    
for (int i=1;i<26;i++)System.out.println("From node "+(format?"A":1)+ " to node "+ (format?(char)(65+i):i));

这里有结果

From node A to node 66
From node A to node 67
From node A to node 68
...

这不是我想要的。它应该是“从节点A到节点B”等... 我按照建议将// 2中的短类型更改为int,但它(类型)不是我要问的点。所以请不要介意。

4 个答案:

答案 0 :(得分:2)

我无法理解你想要实现的目标(以及你为什么要使用短变量),但你所观察到的行为在the Java Language Specification中有所解释:

  

如果其中一个操作数是T类型,其中T是byte,short或char,另一个操作数是int类型的常量表达式(第15.28节),其值可以在类型T中表示,那么类型为条件表达式是T.

这解释了您在第一个示例中看到的内容:65是int类型的常量表达式,(char)(65+1)是char,因此三元表达式的类型为char。

  

否则,二进制数字提升(第5.6.2节)将应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型。

这解释了你在第二个例子中看到的内容:一个是short类型,另一个是char类型:它们都被提升为int,结果因此类型为int。

要做你想要达到的目标,我会做类似的事情:

private String formatNode(int node) {
    return formatAsInteger ? Integer.toString(node + 1) : Character.toString((char) (node + 'A'));
}

// ...

for (int i = 1; i < 26; i++) {
    System.out.println("From node " + formatNode(0) + " to node " + formatNode(i));
} 

答案 1 :(得分:1)

您的代码中存在两个问题,?:中的第二个和第三个表达式的类型不同,以及由于使用true而导致的死代码。我用两种不同的方法解决了第一个问题。第一个println在两个int表达式之间进行选择,并将结果转换为char。第二种情况是每个选定的表达式。我通过使用编译器不知道的布尔值修复了第二个问题。

public class Test {
  public static void main(String[] args) {
    boolean test = args.length < 1;
    System.out.println((char) (test ? (65 + 1) : 65));
    System.out.println(test ? (char) (65 + 1) : (char) 65);
  }
}

答案 2 :(得分:0)

尝试:

System.out.println(true?(char)(65+1):65);//1

char a=65;
System.out.println(true?(char)(65+1):a);//2

答案 3 :(得分:0)

如果我理解你的问题,那就是你应该写的:

System.out.println((char)(false?(65+1):65));

你需要施放结果。