Tag: 自动装箱

为什么Java自动装箱不能扩展到自动装箱types方法的方法调用?

我想将一个原语转换成一个string,我试过: myInt.toString(); 这失败了,错误: int cannot be dereferenced 现在,我得到的原语不是引用types(即不是一个对象),所以不能有方法。 然而,Java 5引入了自动装箱和拆箱(一个C#…我从来不喜欢的C#,但这是旁边的点)。 所以与自动装箱,我期望上述将myInt转换为一个整数,然后调用toString()。 此外,我相信C#允许这样的通话,除非我记错了。 这只是Java的自动装箱/拆箱规格的一个不幸的缺点,还是有一个很好的理由呢?

自动装箱调用valueOf()?

我试图确定下列陈述是否保证是正确的: ((Boolean)true) == Boolean.TRUE ((Boolean)true) == Boolean.valueOf(true) ((Integer)1) == Integer.valueOf(1) 我一直认为自动装箱就相当于在相应的types上调用valueOf() 。 我在这个话题上看到的每一个讨论似乎都支持我的假设。 但是我能在JLS中find以下内容( §5.1.7 ): 如果值为p的盒子是一个介于-128和127之间(§3.10.1)的inttypes的整数文字,或者是布尔文字true或false (§3.10.3),或者在'\u0000'和(§3.10.4),然后让a和b成为p的任意两个装箱转换的结果。 总是这样, a == b 。 这描述了与 valueOf()相似的行为。 但是似乎没有任何保证valueOf()被实际调用,这意味着在理论上可以有一个实现为自动复制值保留一个单独的专用caching。 在这种情况下,caching自动复制值和常规caching盒装值之间可能不存在标识相等性。 Oracle的自动装箱教程指出事实上, li.add(i)被编译为li.add(Integer.valueOf(i)) ,其中i是一个int 。 但是我不知道教程是否应该被认为是一个权威的来源。 *这是一个比valueOf()略弱的保证,因为它只涉及字面值。

“a <= b && b <= a && a!= b”如何可以为真?

这是我必须弄清楚它是如何可能的代码。 我有一个线索,但我不知道该怎么做。 我认为这是关于负数和正数,也可能是variables修饰符。 我是一个初学者,我到处寻找解决scheme,但我找不到任何可用的东西。 问题是:你需要声明和初始化这两个variables。 if条件必须为真。 代码: if( a <= b && b <= a && a!=b){ System.out.println("anything…"); } 我感谢你花时间。

如何将Double 转换为double ?

我正在实现一个接口,其function类似于可以包含对象types的表。 该接口指定了以下function: double[] getDoubles(int columnIndex); 我被难倒的是,在我的实现中,我将表格数据存储在一个二维Object数组( Object[][] data )中。 当我需要返回值时,我想要做以下操作(假定getDoubles()只会在包含双精度的列上被调用,所以不会有ClassCastExceptions ): double[] getDoubles(int columnIndex) { return (double[]) data[columnIndex]; } 但是 – Java不允许将Object[]转换为double[] 。 将它转换为Double[]是可以的,因为Double是一个对象而不是一个原语,但是我的接口指定数据将作为double[]返回。 所以我有两个问题: 有什么办法可以从列Object[][]表中获取列数据并返回基元数组? 如果我改变接口来返回Double[] ,会不会有任何性能影响?

Java中的Tricky三元运算符 – 自动装箱

我们来看下面代码片段中简单的Java代码: public class Main { private int temp() { return true ? null : 0; // No compiler error – the compiler allows a return value of null // in a method signature that returns an int. } private int same() { if (true) { return null; // The same is not possible with if, […]

是否保证新的Integer(i)==我在Java?

考虑下面的代码片段: int i = 99999999; byte b = 99; short s = 9999; Integer ii = Integer.valueOf(9); // should be within cache System.out.println(new Integer(i) == i); // "true" System.out.println(new Integer(b) == b); // "true" System.out.println(new Integer(s) == s); // "true" System.out.println(new Integer(ii) == ii); // "false" 这很明显,为什么最后一行总是打印"false" :我们正在使用==引用标识比较,并且一个new对象将永远不会==到一个已经存在的对象。 问题是关于前3行:这些比较保证在原始int ,与Integer自动拆箱? 有没有原始的情况下将自动盒,而参考身份比较是执行? (这将是false !)

Java:自动装箱和铸造有什么区别?

这个问题是关于“为什么自动装箱在Java中使某些调用模糊不清?” 但通读答案,有一些参考铸造,我不知道我完全理解的差异。 有人可以提供一个简单的解释?

为什么我们在Java中使用自动装箱和拆箱?

自动装箱是Java编译器在基元types和相应的对象包装类之间进行的自动转换。 例如,将int转换为Integer,double转换为Double等等。 如果转换是另一种方式,则称为拆箱。 那么为什么我们需要它,为什么我们在Java中使用自动装箱和拆箱呢?

Java:原始数据types的数组不会自动装箱

我有这样的一个方法: public static <T> boolean isMemberOf(T item, T[] set) { for (T t : set) { if (t.equals(item)) { return true; } } return false; } 现在我尝试调用这个方法使用char T : char ch = 'a'; char[] chars = new char[] { 'a', 'b', 'c' }; boolean member = isMemberOf(ch, chars); 这不起作用。 我期望char和char[]被自动装箱到Character和Character[] ,但是这似乎没有发生。 任何见解?

布尔,有条件的操作和自动装箱

为什么这会抛出NullPointerException public static void main(String[] args) throws Exception { Boolean b = true ? returnsNull() : false; // NPE on this line. System.out.println(b); } public static Boolean returnsNull() { return null; } 而这不是 public static void main(String[] args) throws Exception { Boolean b = true ? null : false; System.out.println(b); // null } ? 解决方法是通过Boolean.FALSEreplacefalse来避免null被解除boolean是不可能的。 […]