2016-10-16 3 views
2

Допустим, что у меня есть параметризованный классСоздание экземпляра класса параметризованных с помощью экземпляра java.lang.Class

public class<K> MyClass { 
    private K val; 

    public K getVal() { return val; } 

    public void setVal(K val) { this.val = val; } 
} 

Моя цель, чтобы иметь возможность создать экземпляр этого класса с помощью параметра что я передаю в качестве аргумента. Этот параметр имеет тип java.lang.Class. Что-то по линиям

public void createInstance(Class<?> klass) { 
    MyClass<klass> k = new MyKlass<>(); 
} 

Теперь, я знаю, что это неверно. Я не могу передать переменную класс как параметр для MyClass. Но возможно ли создать экземпляр MyClass, который параметризуется классом, представленным переменной klass?

ответ

2

Возможно ли создать экземпляр MyClass, параметризованный классом, представленным переменной klass?

No.

Причина заключается в том, насколько ваша программа обеспокоен, когда он работает, нет никакой разницы между Foo<Bar> и Foo<Baz>.

Создайте его и бросьте его. Любое другое решение будет эквивалентно этому.

1

Трактовка ответ Луи Вассермана:

Вы можете создать мета-завод, чтобы выплюнуть экземпляры класса заводов:

public class MyClassFactory<K> { 
    final Class<K> klass; 

    protected MyClassFactory(final Class<K> clazz) { 
     klass = clazz; 
    } 

    protected K create() throws InstantiationException, IllegalAccessException { 
     return klass.newInstance(); 
    } 

    public static <K> MyClassFactory<K> createFactory(final Class<K> clazz) throws InstantiationException, IllegalAccessException { 
     return new MyClassFactory(clazz); 
    } 
} 

А потом называют это что-то вроде этого:

MyClassFactory<? extends MyClass> myClassFactory = MyClassFactory.createFactory((new MyClass<Foo>()).getClass()); 
MyClass<Foo> myFooClass = myClassFactory.create(); 
Foo foo = new Foo(); 
myFooClass.setVal(foo); 

Но вы заметите, что произведенные заводы дают вам <? extends MyClass>, а не MyClass<Foo>, поэтому вы также можете это сделать (С той же фабрики):

MyClass<Baz> myBazClass = myClassFactory.create(); 
Baz baz = new Baz(); 
myBazClass.setVal(baz); 
System.out.println(myBazClass.getVal()); 

И к сожалению, также это:

MyClass fubar = myClassFactory.create(); 
Object obj = new SomeArbitraryObject(); 
fubar.setVal(obj); 
System.out.println(fubar.getVal()); 
Смежные вопросы