русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Создание экземпляров типов


Дата добавления: 2015-06-12; просмотров: 567; Нарушение авторских прав


Попытка создания new T() в Erased.java не работает отчасти из-за стирания, а отчасти из-за того, что компилятор не может убедиться в наличии у Т конструктора по умолчанию (без аргументов). Но в C++ эта операция естественна, прямолинейна и безопасна (проверка выполняется во время компиляции):

//: generics/InstantiateGenericType.java

import static net.mindview.util.Print.*;

class ClassAsFactory<T> {

T x;

public ClassAsFactory(Class<T> kind) {

try {

x = kind.newInstance();

} catch(Exception e) {

throw new RuntimeException(e);

}

}

}

 

class Employee {}

 

public class InstantiateGenericType {

public static void main(String[] args) {

ClassAsFactory<Employee> fe =

new ClassAsFactory<Employee>(Employee.class);

print("ClassAsFactory<Employee> успех");

try {

ClassAsFactory<Integer> fi =

new ClassAsFactory<Integer>(Integer.class);

} catch(Exception e) {

print("ClassAsFactory<Integer> неудача");

}

}

}

<spoiler text="Output:">

ClassAsFactory<Employee> успех

ClassAsFactory<Integer> неудача

</spoiler> Программа компилируется, но с ClassAsFactory<Integer> происходит сбой, так как Integer не имеет конструктора по умолчанию. Ошибка не обнаруживается во время компиляции, поэтому специалисты из Sun считают такие решения нежелательными. Вместо этого рекомендуется использовать явную фабрику и ограничивать тип, чтобы принимался только класс, реализующий эту фабрику:

//: generics/FactoryConstraint.java

interface FactoryI<T> {

T create();

}

 

class Foo2<T> {

private T x;

public <F extends FactoryI<T>> Foo2(F factory) {

x = factory.create();

}

// ...

}

 

class IntegerFactory implements FactoryI<Integer> {



public Integer create() {

return new Integer(0);

}

}

 

class Widget {

public static class Factory implements FactoryI<Widget> {

public Widget create() {

return new Widget();

}

}

}

 

public class FactoryConstraint {

public static void main(String[] args) {

new Foo2<Integer>(new IntegerFactory());

new Foo2<Widget>(new Widget.Factory());

}

}

В сущности, это всего лишь разновидность передачи Class<T>. В обоих вариантах передаются объекты фабрик; просто в случае с Class<T> объект фабрики оказывается встроенным, а при предыдущем решении он создается явно. Тем не менее в обоих случаях реализуется проверка времени компиляции. Другое решение основано на использовании паттерна «шаблонный метод». В следующем примере get() — шаблонный метод, a create() определяется в субклассе для получения объекта этого типа:

//: generics/CreatorGeneric.java

abstract class GenericWithCreate<T> {

final T element;

GenericWithCreate() { element = create(); }

abstract T create();

}

 

class X {}

 

class Creator extends GenericWithCreate<X> {

X create() { return new X(); }

void f() {

System.out.println(element.getClass().getSimpleName());

}

}

 

public class CreatorGeneric {

public static void main(String[] args) {

Creator c = new Creator();

c.f();

}

}

<spoiler text="Output:">

X

</spoiler>

 



<== предыдущая лекция | следующая лекция ==>
Компенсация за стирание | Массивы параметризованных типов


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.007 сек.