Equivalient method overload why necessary?

前端 未结 3 1156
甜味超标
甜味超标 2021-01-18 00:32

I browsed some JAVA code made by Google, and I found the ImmutableSet: http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html

3条回答
  •  独厮守ぢ
    2021-01-18 00:53

    It can't be related to performance, actually: All the methods delegate to the same creation method, which expects an array anyhow.

    My guess is that it is related to warnings. Consider the following, minimal snippet:

    import java.util.List;
    
    class ImmutableSet
    {
    }
    public class ParametersTest
    {
        public static void main(String[] args)
        {
            List list0 = null;
            List list1 = null;
            of(list0, list1);
        }
    
        @SuppressWarnings("unchecked")
        public static  ImmutableSet of(E e1, E e2) {
            return create(e1, e2);
        }
    
        public static  ImmutableSet of(E... elements) {
            return create(elements);
        }
    
        private static  ImmutableSet create(E... elements) 
        {
            return null;
        }
    
    }
    

    The call to of in the main method is fine: It matches the 2-args-version of the of method. Now comment out the 2-args-version of the of-method. Then the call is still OK, but will directly invoke the varags version. This will cause a generic array to be created, and cause a warning. (This warning is suppressed in the 2-args-version, obviously).

    So to summarize, I assume that this is in order to avoid warnings for clients of the library who want to invoke the of method with several objects of a generic type.

    Fortunately, things like this will no longer be necessary in the future, thanks to http://docs.oracle.com/javase/7/docs/api/java/lang/SafeVarargs.html

提交回复
热议问题