【问题标题】: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 写的关于该案例的内容。

标签: java arrays generics


【解决方案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谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2019-09-16
相关资源
最近更新 更多