为啥这里不发生隐式转换?

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谢谢!

以上是关于为啥这里不发生隐式转换?的主要内容,如果未能解决你的问题,请参考以下文章

为啥“as”运算符在 C# 中不使用隐式转换运算符?

Java - 为啥 char 不应该被隐式转换为字节(和短)原语?

为啥首先允许指针从非常量到常量的隐式转换?

为啥允许从 int 到 byte 但不允许从 long 到 int 的隐式缩小转换?

C的隐式类型转换

为啥 Java 和 C# 没有到布尔值的隐式转换?