为啥这里不发生隐式转换?
Posted
技术标签:
【中文标题】为啥这里不发生隐式转换?【英文标题】:Why doesn't implicit casting happen here?为什么这里不发生隐式转换? 【发布时间】:2015-06-30 01:10:45 【问题描述】:我希望将 char
的数组转换为字符的 Set
。
从逻辑上讲,如果我写出类似How to convert an Array to a Set in Java 的内容而不是使用内置函数,它会起作用。但是,使用带有泛型的内置函数则不然。
TreeSet<Character> characterSet = Sets.newTreeSet();
String myString = "string";
Character [] characterArray = 's','t','r','i','n','g';
Collections.addAll(characterSet,characterArray); // This works
Collections.addAll(characterSet,myString.toCharArray()); // This Does not
为什么不将char
的数组转换为characters
?
作为对答案的跟进。 (顺便说一句,谢谢)我想一个简单的例子就是为什么第一行隐式转换而第二行没有?
Character [] characterArray = 's','t','r','i','n','g'; // works
Character [] characterArray2 = myString.toCharArray(); // does not work
我的理解是右手边都 make character[]
variabless
【问题讨论】:
简而言之:没有从“原始类型数组”到“包装类型数组”的自动装箱。 你的意思是myString.toCharArray()
和's','t','r','i','n','g'
不是同一个类型?
阅读@kocko 写的关于该案例的内容。
【参考方案1】:
因为myString.toCharArray()
将返回char[]
,而不是Character[]
。你可以通过这个简单的测试来验证它:
char[] a = 'a' ;
Character[] b = 'b' ;
a = b; //doesn't work, because char[] is not a Character[]
但是Character[] characterArray = 's','t','r','i','n','g';
与Collections.addAll(...)
兼容,因为在初始化数组时,每个值都会从char
自动装箱到Character
。
【讨论】:
为什么在我的第二个示例中使用's','t','r','i','n','g'
有效?那不是返回类型char[]
吗?
如我所说,每个值都自动装箱为Character
,最终生成Character[]
。这是数组初始化器的一个特性
啊。我没有意识到它有特殊规则docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6谢谢!以上是关于为啥这里不发生隐式转换?的主要内容,如果未能解决你的问题,请参考以下文章
Java - 为啥 char 不应该被隐式转换为字节(和短)原语?