Создание параметра типа без передачи объекта - PullRequest
2 голосов
/ 30 ноября 2009

Мой вопрос очень похож на этот вопрос. Я хочу иметь возможность создавать экземпляр объекта типа параметра типа, но также без необходимости передавать "фабрику". Мне действительно нужно содержать все в одном классе.

public class myClass<E> {
    E someObject;

    public myClass(){
         someObject = new E();
    }
}

В предыдущих решениях требовалось изменить конструктор myClass, чтобы он имел заводской параметр, а затем вызывать его конструктор, но для моих целей я не хочу изменять какие-либо вызовы myClass извне.

Ответы [ 3 ]

7 голосов
/ 30 ноября 2009

Проблема в том, что вы не знаете, что такое E, и как его построить. Это может быть любой тип (это универсально количественно ). Вы должны предоставить доказательства того, что, независимо от E, оно действительно может быть построено. «Фабрика» данного типа служит своего рода свидетельством того, что она может.

Подумайте об этом на секунду: что если я передам Void в качестве параметра E? Как бы вы пошли на создание значения типа Void?

Возможность построить E для всех E - все равно что создать что-то из ничего. Это логическая невозможность. ∀E. E - необитаемый комплект.

То, что вы действительно хотите, это либо для E иметь ограничение, либо для передачи конструктора (фабрики) в качестве свидетельства того, что E находится в наборе конструируемых объектов.

1 голос
/ 30 ноября 2009

Нет, как объясняется в ответах на связанный вопрос, вы не можете этого сделать. Модифицируйте интерфейс для передачи в фабричный объект. (Примечание: Class делает плохую фабрику.)

0 голосов
/ 30 ноября 2009

Вы знаете, что ваш код не работает, и вы ожидаете решения с достаточно близким синтаксисом.

Как насчет этого?

//doesn't work. cannot make x.someObject a new String()
//MyClass<String> x = new MyClass<String>();

//this can work...
MyClass<String> x = MyClass.neu(String.class);

public class MyClass<E>
{
    static public <T> MyClass<T> neu(Class<T> clazz){...}
}
...