Если URL-адрес https, как и для Amazon S3, используйте getURL
json <- fromJSON(getURL('https://s3.amazonaws.com/bucket/my.json'))
Если Вы хотите не ввести имя класса дважды во время инстанцирования как в:
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();
}
}
Вот опция, которую я придумал, она может помочь:
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();
}
FETCH ref INTO target;
Cunsult документы курсора для получения дополнительной информации о том, как использовать курсор. postgresql.org/docs/8.1/static/plpgsql-cursors.html
– bpgergo
31 July 2012 в 13:14
Вам будет нужна некоторая абстрактная фабрика одного вида или другого для перекладывания ответственности на:
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();
}
}
Вы корректны. Вы не можете сделать new E()
. Но можно изменить его на
private static class SomeContainer<E> {
E createContents(Class<E> clazz) {
return clazz.newInstance();
}
}
, Это - боль. Но это работает. Обертывание его в шаблоне "фабрика" делает его немного более терпимым.
Как Вы сказали, Вы не можете действительно сделать этого из-за стирания типа. Можно отсортировать, делают это с помощью отражения, но требуются много кода и партия обработки ошибок.
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 );
, Но это - большая работа, и только работает на подклассы. Может быть удобным все же.
Если Вы имеете в виду 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++;
}
}
Можно использовать:
Class.forName(String).getConstructor(arguments types).newInstance(arguments)
, Но необходимо предоставить точное имя класса, включая пакеты, например, java.io.FileInputStream
. Я использовал это для создания синтаксического анализатора математических выражений.