Dmitry Nadezhin
|
Posted: September 15, 2009 03:31 by Dmitry Nadezhin
|
| В этом топике предлагая обсуждать язык Java, другие языки программирования для JVM и библиотеки на них |
Языки и библиотеки
Replies: 1 - Last Post: September 15, 2009 05:20
by: Dmitry Nadezhin
by: Dmitry Nadezhin
showing 1 - 2 of 2
Dmitry Nadezhin
|
Posted: September 15, 2009 05:20 by Dmitry Nadezhin
|
|
Вопрос Егора ------------------- вопрос про генерики - никак не могу понять что это такое! class MyClass < T> () System.out.println(Double.class); -можно System.out.println(T.class); - нельзя хотя вот тка Т a; System.out.println(a.getClass); - синтаксически можно, но по факту нельзя T a=new T(); - нельзя в общем можно только если к нам пришел уже готовый экземпляр класса - тогда все можно. Вот и получается что "T" - это не класс не объект и вообще непонятно чё это почему меня это заинтересовало : Пример: есть два класса class A< T>(){} class B< T>(){} что я хочу: создать класс A, а потом класс B от того же генерика что и А - причем генерик хочу взять именно из уже созданного экземпляра А. примерно так A a=new A< T>(); B b= new B< a.T.getClass>(); и я не знаю как это сделать. ----------------------------------------- Пока что генерики - компиляторные штучки, хотя может быть потом сделают по-другому. В Run time системе объекты, созданные вызовами new ArrayList< Double> и new ArrayList< Float>, имеют один и тот же тип. Если хочется, чтобы создавать произвольный класс. это можно сделать примерно так. A) Конструктор без параметров: public class Factory < T> { private Class< T> cls; public Factory(Class< T> cls) { this.cls = cls; } public Class< T> getObjectClass() { return cls; } public T newInstance() { try { return cls.newInstance(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } return null; } } Factory< MyClass> f = new Factory<MyClass>(); MyClass o = f.newInstance(); Этот способ требует, чтобы MyClass имел бы явный или неявный конструктор без параметров MyClass(). Неявный конструктор компилятор вставляет, когда нет больше ни одного конструктора. B) С произвольными конструкторами - используя пакет java.lang.reflection C) Если нужны фабрики для ограниченного набора классов - можно написать их явно abstract class Factory< T> { abstract T newInstance(); } Factory<Double> f = new Factory< MyClass>() { MyClass newInstance() { return new MyClass(0); } } MyClass o = f.newInstance(); Первый пример с Factory я скинул в ваш репозиторий. |
Replies: 1 - Last Post: September 15, 2009 05:20
by: Dmitry Nadezhin
by: Dmitry Nadezhin






