LINUX.ORG.RU

Java, как в generic-методе создать экземпляр generic-класса?

 , , ,


0

2

Есть класс:

class Foo<T extends Bar> {
...
}

Есть другой класс, который должен в одном из методов создать экземпляр класса Foo. Хочется при обращении к этому методу передать тип для создаваемого экземпляра класса Foo. Предположительно (код неверный) это должно быть что-то вроде:

class Abs {
   public <T extends Bar> Foo<T> createFoo<T>() {
      return new Foo<T>();
   }
}

...

Abs abs = new Abs();
Foo<BarExtended> foo = abs.createFoo<BarExtended>();

знаю, что в шарпе есть методы, принимающие тип данных в скобках <>. А в яве как быть?

★★★★★

Если хочешь создавать объекты, передавай Class<? extends Bar>

anonymous
()

А в яве как быть?

Ты компилятору не пробовал скормить то что написал в вопросе?

Deleted
()
Ответ на: комментарий от RedPossum

И я за бан

Ты дал неправильные советы по всем пунктам, кроме последнего: тебя действительно стоит забанить.

Deleted
()
Ответ на: комментарий от Deleted

Ты дал неправильные советы по всем пунктам, кроме последнего: тебя действительно стоит забанить.

ты прав.

RedPossum ★★★★★
()

Никак. Невозможно это. В runtime нет информации о типе. Увы, так криво реализовано это в JVM (потому что появилось не сразу, а добавили потом, не нарушая обратной совместимости).

BattleCoder ★★★★★
()
Ответ на: комментарий от RedPossum

1) нихачу

2) ну допустим, фабрики, ок. погуглил немного. остался вопрос: как вызвать newInstance() с параметром (конструктор же - у меня класс Foo в конструкторе имеет параметр) у генерик типа? получилось состряпать это, но оно не компилируется:

class Api {
    public <T extends Bar> Foo<T> makeRequest(Class<T> c) {
        return Foo<T>.class.getDeclaredConstructor(Api.class).newInstance(this);
    }
}

3) вот что за мода пошла на этот «я поищу за тебя». знал бы я, что именно искать - не спрашивал здесь бы.

зы. а ты кто именно из забанов: герцог или рыба?

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от Deleted

1) не работает, к сожалению.

на строку

public <T extends Bar> Foo<T> createFoo<T>() {

ругается, мол '(' expected.

т.е. он хочет, чтобы я не указывал <T> после имени метода.

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

Очень часто достаточно перевести вопрос на английский и ввести его в гугл - с вероятностью 90% (если вопрос частый) - первая-вторая ссылка попадёт на stack overflow - там куча ответов на один и тот же вопрос.

BattleCoder ★★★★★
()
Ответ на: комментарий от BattleCoder

Если б я мог это сформулировать на русском :)

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Пытаюсь, пытаюсь... пока не взлетает.

bvn13 ★★★★★
() автор топика
Ответ на: комментарий от bvn13

Да, но если я уберу, то как тогда вызывать этот метод createFoo с генерик-параметром?

Foo<BarExtended> foo = abs.<BarExtended>createFoo();

Шарп моск съел, уже доку прочитать лень?

Deleted
()
Ответ на: комментарий от bvn13

Почитай документацию какую-нибудь, вопросы из разряда «мне лень открыть книжку».

Legioner ★★★★★
()
Ответ на: комментарий от Deleted

оу, не подумал бы, что генерик-тип в яве перед методом пишется :) спасибо.

bvn13 ★★★★★
() автор топика

Я как-то так делал:

public StandardParser(Class<E> inRefClass) throws InstantiationException, IllegalAccessException {
   refClass = inRefClass;
   reference = refClass.newInstance();
}

spoilt ★★★
()

А в жабе generic - это такой синтаксический сахар, вместо тайп-каста.

invy ★★★★★
()

хорош уже прикалываться над этим говном. в жабени есть только фабрики.

anonymous
()

public class Abs {

    public <T extends Bar> T createFoo(Class<T> c) {
        T f = null;        
        try {
            f = c.newInstance();
        } catch (IllegalAccessException | InstantiationException e) {
            e.printStackTrace(System.err);
        }
        return f != null ? f : null;
    }

}

ThePretender
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.