Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Java > generics + new = problem

Reply
Thread Tools

generics + new = problem

 
 
Mauro
Guest
Posts: n/a
 
      04-20-2007
HI All,
This problem is not new, I read a lot, but I still do not understand
if there's a solution or not (shame on me).

The problem is: I want to build a generic class that constructs new
instances of the type variable.
i.e.:

public interface IOCElement extends Serializable, ChangeEmitter {
public String getName();
}

public class GenericListModel<T extends IOCElement> extends
AbstractListModel
implements ComboBoxModel, ChangeListener {
static final long serialVersionUID = 1l;

private ArrayList<T> tList = null;

public GenericListModel() {
tList = new ArrayList<T>();
}

// AbstractListModel implementation
public Object getElementAt(int index) { return tList.get(index); }
public int getSize() { return tList.size(); }
// needed for FreeMarker
public ArrayList<T> getTasks() { return tList; }
// ComboBoxModel implementation
transient private int selectedItem = -1;
public Object getSelectedItem() { return (selectedItem>=0)?
get(selectedItem): null; }
public void setSelectedItem(Object anItem) { if (anItem instanceof
IOCElement) { selectedItem = pos(((IOCElement)anItem).getName()); } }

// API
public T get(int index) { return tList.get(index); }
public int add(String name) {
int index = 0;
if (tList.add(new T(name))) {
index = tList.size();
tList.get(index-1).addChangeListener(this);
selectedItem = -1;
fireIntervalAdded(this, index, index);
}
return index-1;
}
..... etc. etc.

Everything is ok BUT the line that reads:
if (tList.add(new T(name))) {

I understand that erasures make this difficult for the compiler, but:
Is there a way around this (possibly using newInstance(),
constructor() or whatever)?
Can someone tell me exactly what I should do? (if anything can be
done).

Thanks in Advance
Mauro

 
Reply With Quote
 
 
 
 
Tom Hawtin
Guest
Posts: n/a
 
      04-20-2007
Mauro wrote:
>
> The problem is: I want to build a generic class that constructs new
> instances of the type variable.


> if (tList.add(new T(name))) {


Even if T was, say, an interface you would still have a problem,
generics or not.

What you need is a factory.

interface NamedObjectFactory<T> {
T create(String name);
}
....
interface IOCElementSubtype extends IOCElement {
...
}
....
class ConcreteIOCElement implements IOCElementSubtype {
...
}
....
new GenericListModel<IOCElementSubtype>(
new NamedObjectFactory<IOCElementSubtype>{
public IOCElementSubtype create(String name) {
return new ConcreteIOCElement(name);
}
}
)
....
if (data.add(factory.create(name))) {

Tom Hawtin
 
Reply With Quote
 
 
 
 
CD1
Guest
Posts: n/a
 
      04-20-2007
Hi Mauro,

How can you tell the type T has a constructor with a String parameter?
If you know you'll only use a type (or certain types) in this method,
try not using generics.

Cya!

On Apr 20, 3:39 pm, Mauro <(E-Mail Removed)> wrote:
> HI All,
> This problem is not new, I read a lot, but I still do not understand
> if there's a solution or not (shame on me).
>
> The problem is: I want to build a generic class that constructs new
> instances of the type variable.
> i.e.:
>
> public interface IOCElement extends Serializable, ChangeEmitter {
> public String getName();
>
> }
>
> public class GenericListModel<T extends IOCElement> extends
> AbstractListModel
> implements ComboBoxModel, ChangeListener {
> static final long serialVersionUID = 1l;
>
> private ArrayList<T> tList = null;
>
> public GenericListModel() {
> tList = new ArrayList<T>();
> }
>
> // AbstractListModel implementation
> public Object getElementAt(int index) { return tList.get(index); }
> public int getSize() { return tList.size(); }
> // needed for FreeMarker
> public ArrayList<T> getTasks() { return tList; }
> // ComboBoxModel implementation
> transient private int selectedItem = -1;
> public Object getSelectedItem() { return (selectedItem>=0)?
> get(selectedItem): null; }
> public void setSelectedItem(Object anItem) { if (anItem instanceof
> IOCElement) { selectedItem = pos(((IOCElement)anItem).getName()); } }
>
> // API
> public T get(int index) { return tList.get(index); }
> public int add(String name) {
> int index = 0;
> if (tList.add(new T(name))) {
> index = tList.size();
> tList.get(index-1).addChangeListener(this);
> selectedItem = -1;
> fireIntervalAdded(this, index, index);
> }
> return index-1;
> }
> .... etc. etc.
>
> Everything is ok BUT the line that reads:
> if (tList.add(new T(name))) {
>
> I understand that erasures make this difficult for the compiler, but:
> Is there a way around this (possibly using newInstance(),
> constructor() or whatever)?
> Can someone tell me exactly what I should do? (if anything can be
> done).
>
> Thanks in Advance
> Mauro



 
Reply With Quote
 
Adam Maass
Guest
Posts: n/a
 
      04-21-2007

"Mauro" <(E-Mail Removed)> wrote:
>
> This problem is not new, I read a lot, but I still do not understand
> if there's a solution or not (shame on me).
>
> The problem is: I want to build a generic class that constructs new
> instances of the type variable.
> i.e.:
>


The classical answer is to require a parameter of type Class<T>.

Then you can keep the Class variable and reflect on it using
....newInstance().

Of course, there's no guarantee that the Class will actually have a
constructor with the parameters you expect.


 
Reply With Quote
 
Tom Hawtin
Guest
Posts: n/a
 
      04-21-2007
Adam Maass wrote:
>
> The classical answer is to require a parameter of type Class<T>.


That's the classical answer to a different question...

> Then you can keep the Class variable and reflect on it using
> ...newInstance().


Noooo, not reflection! Class.newInstance is the most evil of them all.

Tom Hawtin
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
generics depending on generics Soul VHDL 0 02-02-2009 09:14 AM
new to generics Collins Java 7 11-07-2006 04:05 PM
Can't convert a generics list of objects into a generics list ofinterfaces Juergen Berchtel Java 1 05-20-2005 02:07 PM
Cast, generics and clone problem tamas.hauer Java 15 03-19-2005 03:54 PM
Will the new Generics mechanism still use runtime casting? Dave Stallard Java 37 10-08-2003 05:23 PM



Advertisments