This discussion is archived
3 Replies Latest reply: Apr 23, 2010 9:08 AM by DrClap RSS

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

843793 Newbie
Currently Being Moderated
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 Expert
    Currently Being Moderated
    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 Newbie
    Currently Being Moderated
    @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 Expert
    Currently Being Moderated
    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.