Языки и библиотеки

  2 posts   Feedicon  
Replies: 1 - Last Post: September 15, 2009 05:20
by: Dmitry Nadezhin
showing 1 - 2 of 2
 
Posted: September 15, 2009 03:31 by Dmitry Nadezhin
В этом топике предлагая обсуждать язык Java, другие языки программирования для JVM и библиотеки на них
 
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
  • Mysql
  • Glassfish
  • Jruby
  • Rails
  • Nblogo
Terms of Use; Privacy Policy;
© 2010, Oracle Corporation and/or its affiliates
(revision 20120518.3c65429)
 
 
Close
loading
Please Confirm
Close