Передать любой класс в качестве параметра для метода - PullRequest
0 голосов
/ 24 января 2019

Возможно, об этом уже спрашивали раньше, и я видел несколько похожих / похожих строк, но не совсем понял.

В Java, как сделать так, чтобы метод принимал любой класс какпараметр?

Например,

public (AnyClass) myMethod(String whatever, (AnyClass) thisClass){

}

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

myMethod("Hello", ClassA);
myMethod("Hello", ClassB);

Спасибо за любую помощь!

Редактировать:

Был задан пример использования;То, что я делаю, это сопоставление строки JSON с POJO, но пытаюсь абстрагировать всю эту вещь, чтобы ее можно было использовать повторно.Итак, мне нужно иметь возможность пройти через любой класс и строку JSON (или HttpConn), а затем построить, а затем использовать Джексона для создания этого POJO и вернуть объект любого типа, который может быть.

(Идея того, что я хочу сделать):

public Class<?> doSomething(String jsonString, Class<?> clazz){
    clazz newInstance = mapper.readValue(jsonString, clazz);
    return clazz;
}

называется как:

ClassA test = doSomething("String One", ClassA.class);
ClassB testTwo = doSomething("Different format string", ClassB.class);

Надеюсь, что это помогает понять проблему ... и мое понимание решений!

Ответы [ 3 ]

0 голосов
/ 24 января 2019

1) Без информации о типе:

public static Class<?> myMethod(String text, Class<?> clazz) {
    // body
    return clazz;
}

Код клиента:

public static void main(String[] args) {
    Class<?> clss = myMethod("Example", String.class);
}

2) С информацией о типе:

public static <T> Class<T> myMethod(String x, Class<T> clazz) {
    // body
    return clazz;
}

Код клиента:

public static void main(String[] args) {
    Class<String> clsStr = myMethod("Example", String.class);
    Class<?> clsAny = myMethod("Example", String.class);
}

3) Необработанный тип (будет работать, но НЕ рекомендуется):

public static Class myMethod(String x, Class clazz) {
    // body
    return clazz;
}

Код клиента:

public static void main(String[] args) {
    Class<String> clsStr = myMethod("Example", String.class); // warning for Unchecked Assignment 
    Class<?> clsAny = myMethod("Example", String.class);
    Class clsRaw = myMethod("Example", String.class);
}

4) С типоминформация, определенная на уровне класса:

public class Main<T> { 

    // cannot be static
    public Class<T> myMethod(String x, Class<T> clazz) {
        // body
        return clazz;
    }
}

Код клиента:

public static void main(String[] args) {
    Main<String> m = new Main<>();
    Class<String> cls = m.myMethod("x", String.class);
}
0 голосов
/ 24 января 2019

В вашем последнем редактировании пример использования выглядит следующим образом:

ClassA test = doSomething("String One", ClassA.class);

Вопрос показывает путаницу между именем класса, объектом Class и экземпляром класса.Так что просто уточнить, используя приведенный выше пример:

  • Имя класса - ClassA - используется для объявления переменной.

  • AЭкземпляр класса - ClassA.class - это одноэлементный объект, который содержит информацию о классе и может быть передан в качестве аргумента методу.

  • Экземпляр класса - test -это объект.Обычно он создается с помощью ключевого слова new.

Вы не можете использовать объект Class, например ClassA.class, непосредственно в объявлении.Вместо этого вам нужно вызвать метод newInstance() класса Class.Этот метод можно использовать, только если в вашем классе есть конструктор без аргументов.Чтобы создать экземпляр с аргументами конструктора, используйте что-то вроде этого:

public <T> T doSomething(String jsonString, Class<T> clazz) throws ReflectiveOperationException {
    Constructor<T> constructor = clazz.getConstructor(String.class);
    return constructor.newInstance(jsonString);
}

Приведенный выше метод создает экземпляр требуемого класса, используя конструктор, который принимает строку (строку, которая была передана).Измените его тело, чтобы создать экземпляр в соответствии с вашими требованиями.

0 голосов
/ 24 января 2019

Полагаю, вам нужно принять класс некоторого типа T в качестве параметра и также вернуть этот класс.В этом случае подпись вашего метода будет выглядеть примерно так:

public <T> Class<T> myMethod(String whatever, Class<T> clazz){
    // put the rest of your code here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...