incubator-empire-db-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Francis De Brabandere <franci...@gmail.com>
Subject Re: Stupid generics question (possibly)
Date Mon, 25 Jul 2011 06:36:12 GMT
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