Reusable method to transform Iterable to T[]?

后端 未结 3 555
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-20 11:17

I\'m trying to write a generic method to return the contents of an Iterable in array form.

Here is what I have:

public class IterableHelp
{
    publi         


        
3条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-20 11:43

    There's a method Iterables.toArray in Google Guava.

    Looking at the source, it's defined as:

      /**
       * Copies an iterable's elements into an array.
       *
       * @param iterable the iterable to copy
       * @param type the type of the elements
       * @return a newly-allocated array into which all the elements of the iterable
       *     have been copied
       */
      public static  T[] toArray(Iterable iterable, Class type) {
        Collection collection = toCollection(iterable);
        T[] array = ObjectArrays.newArray(type, collection.size());
        return collection.toArray(array);
      }
    

    Where ObjectArrays.newArray eventually delegates to a method that looks like:

      /**
       * Returns a new array of the given length with the specified component type.
       *
       * @param type the component type
       * @param length the length of the new array
       */
      @SuppressWarnings("unchecked")
      static  T[] newArray(Class type, int length) {
        return (T[]) Array.newInstance(type, length);
      }
    

    So it looks like there's no way to avoid the @SuppressWarnings entirely, but you can and should at least constrain it to the smallest possible scope.

    Or, better yet, just use somebody else's implementation!

提交回复
热议问题