2

I'm new to JAVA, currently learning Oracle tutorial generics section. I think there is a mistake there, and I want to make sure I'm not wrong. I'll appreciate your feedback.

I saw the following explanation at https://docs.oracle.com/javase/tutorial/java/generics/restrictions.html

Pair < Integer, Character > p = new Pair<>(8, 'a');

Note that the Java compiler autoboxes 8 to Integer.valueOf(8) and 'a' to Character('a'):

Pair < Integer, Character > p = new Pair<>(Integer.valueOf(8), new Character('a'));

I think this is a mistake and 'a' is actually auto-boxed to Character.valueOf('a').

I wrote the following program to check it. as I thought maybe generics have special boxing, I tried generic method, regular method and generic class:

class TestCharacter<T>{
public <T> void check( T first, T second){
    System.out.println("values: " + first + "  " + second);
    System.out.println(first.equals(second));
    System.out.println( "first == second is " + (first == second) );
    System.out.println( "first == second is " + (first == Character.valueOf('a')) );
}
}

public class TestAutoBoxingIssue{

public static <T> void check1( T first, T second){
    System.out.println("values: " + first + "  " + second);
    System.out.println(first.equals(second));
    System.out.println( "first == second is " + (first == second) );
    System.out.println( "first == second is " + (first == Character.valueOf('a')) );
}
public static void check2( Character first, Character second){
    System.out.println("values: " + first + "  " + second);
    System.out.println(first.equals(second));
    System.out.println( "first == second is " + (first == second) );
    System.out.println( "first == second is " + (first == Character.valueOf('a')) );
}
public static void main(String[] args){
    char first = 'a';
    char second = 'a';
    System.out.println("generic method usage: ");
    check1( first, second );
    System.out.println("=============");

    System.out.println("regular method usage: ");
    check2( first, second );
    System.out.println("=============");

    TestCharacter<Character> t = new TestCharacter<>();
    System.out.println("generic class usage: ");
    t.check(first, second );
    System.out.println("=============");
}

}

output is:

generic method usage: values: a a true first == second is true

first == second is true

regular method usage: values: a a true first == second is true

first == second is true

generic class usage: values: a a true first == second is true

first == second is true

So, I think this demonstrates that 'a' is autoboxed to Character.valueOf.

Am I missing something? Is this the right way to check it?

Thanks.

Eliyahu

1
  • The point of the question was the comment at Oracle java tutorial, which I thought is wrong. therefore, I think it is not a duplicate of the other question. Commented Aug 30, 2018 at 19:09

1 Answer 1

3

Yes, autoboxing is done with valueOf everywhere to take advantage of any caches. For example with Character:

public static Character valueOf(char c) {
    if (c <= 127) { // must cache
        return CharacterCache.cache[(int)c];
    }
    return new Character(c);
}

It's a documentation oversight.

Sign up to request clarification or add additional context in comments.

1 Comment

OK. Thanks. I thought autoboxing is done by valueOf by got confused from the tutorial comment. So if it is an oversight, it is OK. Thanks for the feedback.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.