incubator-empire-db-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Vladimir Lahoda <vlah...@gmail.com>
Subject Re: Stupid generics question (possibly)
Date Mon, 25 Jul 2011 10:01:53 GMT
Hi, it is possible to obtain the runtime type of the generic parameter through a trick using
subclassing and reflection, as described in this post:

http://www.artima.com/weblogs/viewpost.jsp?thread=208860

But I think that your solution with explicit constructor parameter is more robust, straightforward
and readable.

Cheers,
Vladimir
 
On 25. 7. 2011, at 8:36, Francis De Brabandere wrote:

> Because this generics info is not available at runtime?
> 
> http://gafter.blogspot.com/2004/09/puzzling-through-erasure-answer.html
> http://gafter.blogspot.com/2006/11/reified-generics-for-java.html
> 
> On Mon, Jul 25, 2011 at 8:26 AM, Rainer Döbele <doebele@esteam.de> wrote:
>> Hi Andi,
>> 
>> thanks for your answer. I should possibly have a look at Guava.
>> 
>> As mentioned the problem is not really the DBReader, but the fact, that in order
to fill the list, new instances of T have to created.
>> So basically the problem can be reduced to:
>> 
>> public class BeanResult<T extends Object> extends ArrayList<T>
>> {
>> 
>>    public BeanResult(Class<T> c, DBCommand cmd)
>>    {
>>        T obj = c.newInstance();
>>    }
>> ...
>> 
>> And the question remains, whether or not it is possible at all, to get rid of the
"Class<T> c" parameter.
>> I don't really understand, why it is not possible to extract the Class from T.
>> 
>> Regards,
>> Rainer
>> 
>> 
>> Andreas Fink wrote:
>>> from: Andreas Fink [mailto:andi@andreasfink.com]
>>> to: empire-db-dev@incubator.apache.org
>>> re: Re: Stupid generics question (possibly)
>>> 
>>> Hi Rainer.
>>> 
>>> As long as you do not refactor "new DBReader()" to "new DBReader<T>()"
>>> there won't be a way around it.
>>> If you do not need to know the type in "reader.getBeanList" except for
>>> casting, this Could suffice:
>>> 
>>> class DBReader<T> {
>>> 
>>>       getBeanList(beanResult, maxItems) {
>>>               ...
>>>               T someData = (T) someMethodCall();
>>>               ...
>>>       }
>>> 
>>> }
>>> 
>>> If you need to do more, stick to what you posted (this is how Google
>>> Guava does it, btw.) or do something funny at runtime using reflection.
>>> 
>>> The best source for help in cases like this is Angelika Langers generics
>>> FAQ: http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html
>>> 
>>> Cheers,
>>> Andi.
>>> 
>>> On Jul 24, 2011, at 2:00 PM, Rainer Döbele wrote:
>>> 
>>>> Hi,
>>>> 
>>>> 
>>>> 
>>>> This might be a stupid question possibly but I just don't feel like
>>> investigating myself.
>>>> 
>>>> 
>>>> 
>>>> I have introduced a new simple helper class called BeanResult to
>>> simplify queries for a list of POJO's a bit.
>>>> 
>>>> I looks roughly like this:
>>>> 
>>>> 
>>>> 
>>>> public class BeanResult<T extends Object> extends ArrayList<T>
>>>> 
>>>> {
>>>> 
>>>>    private DBCommand cmd;
>>>> 
>>>>    private Class<T> type;
>>>> 
>>>> 
>>>> 
>>>>    public BeanResult(Class<T> type, DBCommand cmd)
>>>> 
>>>>    {
>>>> 
>>>>        this.type = type;
>>>> 
>>>>        this.cmd = cmd;
>>>> 
>>>>    }
>>>> 
>>>> 
>>>> 
>>>>    public int fetch(Connection conn, int maxItems)
>>>> 
>>>>    {
>>>> 
>>>>        clear();
>>>> 
>>>>        DBReader reader = new DBReader();
>>>> 
>>>>        try {
>>>> 
>>>>            // Open and Read
>>>> 
>>>>            reader.open(cmd, conn);
>>>> 
>>>>            reader.getBeanList(this, type, maxItems);
>>>> 
>>>>            return size();
>>>> 
>>>> 
>>>> 
>>>>        } finally {
>>>> 
>>>>            reader.close();
>>>> 
>>>>        }
>>>> 
>>>>    }
>>>> 
>>>> }
>>>> 
>>>> 
>>>> 
>>>> In order to use it, I must write the following:
>>>> 
>>>> 
>>>> 
>>>> BeanResult<SampleBean> result = new
>>> BeanResult<SampleBean>(SampleBean.class, cmd);
>>>> 
>>>> 
>>>> 
>>>> What I don't like is, that I have to pass the SampleBean.class in the
>>> constructor.
>>>> 
>>>> I would rather just write:
>>>> 
>>>> 
>>>> 
>>>> BeanResult<SampleBean> result = new BeanResult<SampleBean>(cmd);
>>>> 
>>>> 
>>>> 
>>>> This is beause the getBeanList uses type.newInstance() to create new
>>> Instances of the bean.
>>>> 
>>>> 
>>>> 
>>>> Does anyone know whether and how to determine the Class from T or
>>> another option to get rid of this extra parameter.
>>>> 
>>>> I have checked the code in under the EMPIREDB-99 branch.
>>>> 
>>>> 
>>>> 
>>>> Regards
>>>> 
>>>> Rainer
>>>> 
>>>> 
>>>> 
>>> 
>>> 
>>> --
>>> web:   http://andreasfink.com/
>>> mail:  af@andreasfink.com
>>> mobil: +34 65 1728443
>>> tel:   +34 93 2082949
>> 
>> 
> 
> 
> 
> -- 
> http://www.somatik.be
> Microsoft gives you windows, Linux gives you the whole house.


Mime
View raw message