3 Replies Latest reply: Apr 23, 2010 11:08 AM by DrClap RSS

    Return an object of the same type as method's parameter

    843793
      Hi,

      Is it possible to do something like that?
      public <T, E> T<E> method(T<E> arg) {    
          T<E> copy = arg.getClass().newInstance();
          return copy;
      }
      The method should create and return generic object on the basis of parameter's type. I would like to operate on Collection<E> without worrying about actual type of collection (List, Set...).

      method(new ArrayList<Something>) should return ArrayList<Something>
      method(new HashSet<Something>) should return HashSet<Something>
      and so on.

      Cheers
        • 1. Re: Return an object of the same type as method's parameter
          DrClap
          Sure, that will work as long as the type in question has an accessible zero-argument constructor. So yes, in your example you could return a new ArrayList or a new HashSet. Not a new ArrayList<Thing>, though, because generics are a compile-time concept only and mean nothing at run time.

          By the way it's more traditional to just pass a Class object directly, instead of a wasted object of that class:
          public Class<?> method(Class<?> arg) {    
              Class<?> copy = arg.newInstance();
              return copy;
          }
          And to call that:
          ArrayList result = method(ArrayList.class);
          • 2. Re: Return an object of the same type as method's parameter
            843793
            @DrClap: shouldn't your method be:
            public Object method(Class<?> arg) {    
                Object copy = arg.newInstance();
                return copy;
            }
            • 3. Re: Return an object of the same type as method's parameter
              DrClap
              Robert.Bossy wrote:
              @DrClap: shouldn't your method be:
              public Object method(Class<?> arg) {    
              Object copy = arg.newInstance();
              return copy;
              }
              Yes, you're right. Or perhaps something like
              public T method(Class<? extends T> arg) {    
                  T copy = arg.newInstance();
                  return copy;
              }
              Although I have to say, this method doesn't look as useful to me as it apparently did to the OP.