Создать экземпляр универсального типа в Java?

Если URL-адрес https, как и для Amazon S3, используйте getURL

json <- fromJSON(getURL('https://s3.amazonaws.com/bucket/my.json'))
539
задан John Woo 6 April 2012 в 11:29
поделиться

8 ответов

Если Вы хотите не ввести имя класса дважды во время инстанцирования как в:

new SomeContainer<SomeType>(SomeType.class);

можно использовать метод фабрики:

<E> SomeContainer<E> createContainer(Class<E> class); 

Как в:

public class Container<E> {

    public static <E> Container<E> create(Class<E> c) {
        return new Container<E>(c);
    }

    Class<E> c;

    public Container(Class<E> c) {
        super();
        this.c = c;
    }

    public E createInstance()
            throws InstantiationException,
            IllegalAccessException {
        return c.newInstance();
    }

}
6
ответ дан jb. 6 April 2012 в 11:29
поделиться

Вот опция, которую я придумал, она может помочь:

public static class Container<E> {
    private Class<E> clazz;

    public Container(Class<E> clazz) {
        this.clazz = clazz;
    }

    public E createContents() throws Exception {
        return clazz.newInstance();
    }
}

РЕДАКТИРОВАНИЕ: Кроме того, можно использовать этого конструктора (но это требует экземпляра E):

@SuppressWarnings("unchecked")
public Container(E instance) {
    this.clazz = (Class<E>) instance.getClass();
}
6
ответ дан Mike Stone 6 April 2012 в 11:29
поделиться

Вам будет нужна некоторая абстрактная фабрика одного вида или другого для перекладывания ответственности на:

interface Factory<E> {
    E create();
}

class SomeContainer<E> {
    private final Factory<E> factory;
    SomeContainer(Factory<E> factory) {
        this.factory = factory;
    }
    E createContents() {
        return factory.create();
    }
}
87
ответ дан Tom Hawtin - tackline 6 April 2012 в 11:29
поделиться
  • 1
    И используйте класс MessageFormat, если Вы хотели бы к строкам формата в локали и независимом от языка пути. – Max 4 April 2012 в 21:12

Вы корректны. Вы не можете сделать new E(). Но можно изменить его на

private static class SomeContainer<E> {
    E createContents(Class<E> clazz) {
        return clazz.newInstance();
    }
}

, Это - боль. Но это работает. Обертывание его в шаблоне "фабрика" делает его немного более терпимым.

313
ответ дан Lii 6 April 2012 в 11:29
поделиться

Как Вы сказали, Вы не можете действительно сделать этого из-за стирания типа. Можно отсортировать, делают это с помощью отражения, но требуются много кода и партия обработки ошибок.

0
ответ дан Adam Rosenfield 6 April 2012 в 11:29
поделиться
  • 1
    Это поможет мне много. I' m без базы данных теперь. Но когда я получил его, завтра утром, я обновлю вопрос сделать его более ясным, это могло быть сомнение в ком-то, и если Вы don' t ум Вы могли также обновить свой ответ для меня, и кто-то делает лучшее понимание ответа. Но я думаю, что Ваша ширина поможет мне закончить функцию!:) – waldyr.ar 1 August 2012 в 01:58

Dunno, если это помогает, но когда Вы разделяете на подклассы (включая анонимно) универсальный тип, информация о типе, доступен через отражение. например,

public abstract class Foo<E> {

  public E instance;  

  public Foo() throws Exception {
    instance = ((Class)((ParameterizedType)this.getClass().
       getGenericSuperclass()).getActualTypeArguments()[0]).newInstance();
    ...
  }

}

Так, при разделении на подклассы Foo Вы получаете экземпляр Панели, например,

// notice that this in anonymous subclass of Foo
assert( new Foo<Bar>() {}.instance instanceof Bar );

, Но это - большая работа, и только работает на подклассы. Может быть удобным все же.

124
ответ дан noah 6 April 2012 в 11:29
поделиться
  • 1
    локализация может стать релевантной в будущем, я hadn' t рассмотрел это. Положительная сторона. – JHarnach 4 April 2012 в 21:10

Если Вы имеете в виду new E() тогда, это невозможно. И я добавил бы, что это не всегда корректно - как Вы знаете, имеет ли E общественность никакой-args конструктор? Но можно всегда делегировать создание к некоторому другому классу, который знает, как создать экземпляр - это может быть Class<E> или пользовательский код как это

interface Factory<E>{
    E create();
}    

class IntegerFactory implements Factory<Integer>{    
  private static int i = 0; 
  Integer create() {        
    return i++;    
  }
}
0
ответ дан Pavel Feldman 6 April 2012 в 11:29
поделиться

Можно использовать:

Class.forName(String).getConstructor(arguments types).newInstance(arguments)

, Но необходимо предоставить точное имя класса, включая пакеты, например, java.io.FileInputStream. Я использовал это для создания синтаксического анализатора математических выражений.

4
ответ дан hichris123 6 April 2012 в 22:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: