tags:

views:

155

answers:

4

Could you please explain why this code is not syntactically correct?

private void addEditor(final Class<? extends FieldEditor> fieldEditorClass, final Composite parent, final PropertyKey propertyKey, final String displayName){
    final Composite composite = new Composite(parent, SWT.NULL);
    composite.setLayout(new GridLayout());
    composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
    final FieldEditor fieldEditor = new >>fieldEditorClass<< (propertyKey.toString(), displayName, composite);
    initializeFieldEditor(fieldEditor);     
}

on line 5, the part between >> and << is underlined in red and it says "can not be resolved to a type".

I hope you can see what I am trying to achieve here. By passing a SomeEditor.class to this method I then want to create an object of this class and initialise it. How can I fix the problem on line 5?


Basically, I want to parametrise the concrete FieldEditor class being instantiated by this code. I have several methods in my code that are essentially identical, except that each instantiates a different class of FieldEditor.

+3  A: 

fieldEditorClass is variable name not a class name. So you can't call new fieldEditorClass (...) on it

You could try

 fieldEditorClass.getClass().getDeclaredConstructor(Class<?>... parameterTypes);

And then run newInstance(Object... initargs) on the gained constructor

jitter
sorry but I see no answer to 'How can I fix the problem on line 5?'
Peter Perháč
What you do on line 5 is simply invalid. As String a="test"; new a("asd"); would be too
jitter
I assure you I understand the basics. your first post, before the edit, just suggested no solution.
Peter Perháč
+5  A: 

You need to instantiate the class using e.g. Reflection. See this answer on SO.

yawn
+2  A: 

By passing a SomeEditor.class to this method I then want to create an object of this class and initialise it.

Sounds like you want a FieldEditor factory to me. A simple example of how I'd do it might look like this:

package generics;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Factory<T extends MyClass>
{
   private Class<T> clazz;

   public T create(String s) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException
   {
      Constructor<T> constructor = clazz.getDeclaredConstructor(String.class);

      return constructor.newInstance(s);
   }
}

As you can see, you didn't provide enough code to sort out your problem. Substitute your class and parameters and it should work.

UPDATE:

Here's the specific case for your code:

package generics;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class FieldEditorFactory<T extends FieldEditor>
{
    private Class<FieldEditor> clazz;

    public FieldEditorFactory(Class<FieldEditor> clazz)
    {
        this.clazz = clazz;
    }

    public T create(String displayName, PropertyKey propertyKey, Composite parent) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException
    {
        Composite composite = new Composite(parent, SWT.NULL);
        composite.setLayout(new GridLayout());
        composite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));

        Constructor<T> constructor = (Constructor<T>) clazz.getDeclaredConstructor(String.class, PropertyKey.class, Composite.class);

        // Why on earth wouldn't the constructor return you a fully-initialized instance?
        // I wouldn't design it with this method.
        //initializeFieldEditor(fieldEditor);

        return constructor.newInstance(displayName, propertyKey, parent);
    }
}
duffymo
+1  A: 

There is rarely any need to use reflection. It is very much better to use just the bog standard language features. A factory is a perfect fit here.

public interface FieldEditorFactory<T extends FieldEditor> {
    T newFieldEditor(
         String propertyKeyName, String displayName, Composite composite
    );
}

(I have added generics, although your example doesn't need them.)

Tom Hawtin - tackline