Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по generic - Как узнать какой тип у generic параметра / 19 сообщений из 19, страница 1 из 1
21.04.2013, 18:11:55
    #38234315
YK13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по generic - Как узнать какой тип у generic параметра
Всем доброго времени суток
Итак оговорюсь сразу – я .NET программист. Но в последнее время приходится очень часто сталкиваться с java. Так что прошу сильно не пинать ногами если вопрос покажется глупым.

Итак есть класс
Код: java
1.
2.
3.
4.
5.
6.
public class MyClass<T>{

       public MyClass(){
       }
	///some Code....
}



Мне необходимо узнать какой тип у T
К сожалению погуглив не нашел вразумительного ответа на этот вопрос.

Можно ли сделать что то подобное тому как это делается в c#
Код: c#
1.
Type t = typeof(T);


Заранее благодарен за совет
С уважением
YK13
...
Рейтинг: 0 / 0
21.04.2013, 18:28:06
    #38234324
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по generic - Как узнать какой тип у generic параметра
YK13,

Пример:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
class MyClass<T> {
    
    private T value; // объявить
    
    public MyClass(T value) {
        this.value = value; // инициализировать
    }
    
    public Class<T> getType() {
        return (Class<T>) value.getClass();
    }
}
...
System.out.println(new MyClass<Integer>(2).getType().getName()); // получаем класс (тип)
...
Рейтинг: 0 / 0
21.04.2013, 20:14:18
    #38234371
YK13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по generic - Как узнать какой тип у generic параметра
Спасибо за совет,

К сожалению такой способ мне не подходит, так как используется конструктор с параметром. Мне нужно в завистмости от того какой класс имеет T вызывать соответствующий метод. Можно ли так сделать. Или в java generic классы ВСЕГДА используют конструктор с параметром?
...
Рейтинг: 0 / 0
21.04.2013, 20:23:57
    #38234373
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по generic - Как узнать какой тип у generic параметра
YK13,

Скорее всего так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public T doSomething(T value) {
    if (value instanceof Integer) {
        ...
    } else if (value instanceof ...) {
        ...
    }...
    return ...;
}
...
Рейтинг: 0 / 0
21.04.2013, 20:41:11
    #38234381
YK13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по generic - Как узнать какой тип у generic параметра
Да нет мне нужно что то типа такого

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class MyClass<T>{
      
       Class<T> ct;


       public MyClass(){
       }

       public void method0(){
           if(ct == MyClass1.class)
			method1();
		else if(ct == MyClass2.class)
			method2();
		else if(ct == MyClass3.class)
			method3();
       }
}



но как мне в этом случае инициализировать ct?
...
Рейтинг: 0 / 0
21.04.2013, 20:41:29
    #38234382
Adva
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по generic - Как узнать какой тип у generic параметра
...
Рейтинг: 0 / 0
21.04.2013, 20:48:26
    #38234383
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по generic - Как узнать какой тип у generic параметра
YK13,

Вместо класса добавьте параметризированный метод:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public <T> void myMethod(Class<T> type) { // тип класса передать в параметрах
    if (type == Integer.class) {
        System.out.println("Integer");
    } else if (type == Long.class) {
        System.out.println("Long");
    }
}
...
new MyClass().doSomething(Integer.class);
new MyClass().doSomething(Long.class);
...
Рейтинг: 0 / 0
21.04.2013, 20:54:08
    #38234386
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по generic - Как узнать какой тип у generic параметра
YK13но как мне в этом случае инициализировать ct? Явно вызвав конструктор (возможно с параметрами) при помощи отражения.
...
Рейтинг: 0 / 0
21.04.2013, 20:56:36
    #38234389
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по generic - Как узнать какой тип у generic параметра
UsmanYK13но как мне в этом случае инициализировать ct? Явно вызвав конструктор (возможно с параметрами) при помощи отражения. 14118502
...
Рейтинг: 0 / 0
21.04.2013, 21:14:37
    #38234399
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по generic - Как узнать какой тип у generic параметра
YK13Или в java generic классы ВСЕГДА используют конструктор с параметром?В Java определить тип generic'а в рантайме не получится,
все делается на этапе компиляции. Поэтому нужно явно
задавать параметр с нужным типом (классом), либо инициализировать.
...
Рейтинг: 0 / 0
21.04.2013, 21:56:48
    #38234415
YK13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по generic - Как узнать какой тип у generic параметра
сделал как здесь

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class MyClass<T> {

	public Class<?> getCType(){
		return ReflectionUtils.getGenericParameterClass(getClass(), 0);
	}
}

public class ReflectionUtils {
	public static Class<?> getGenericParameterClass(Class<?> actualClass, int parameterIndex) {
	    return (Class<?>) ((ParameterizedType) actualClass.getGenericSuperclass()).getActualTypeArguments()[parameterIndex];
	  }
}



в методе getGenericParameterClass выбрасывается исключение ClassCastException
...
Рейтинг: 0 / 0
21.04.2013, 22:43:40
    #38234433
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по generic - Как узнать какой тип у generic параметра
YK13
Код: java
1.
2.
3.
	public static Class<?> getGenericParameterClass(Class<?> actualClass, int parameterIndex) {
	    return (Class<?>) ((ParameterizedType) actualClass.getGenericSuperclass()).getActualTypeArguments()[parameterIndex];
	  }

Здесь написано, что работает только для подклассов.
...
Рейтинг: 0 / 0
21.04.2013, 23:39:16
    #38234455
YK13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по generic - Как узнать какой тип у generic параметра
UsmanВ Java определить тип generic'а в рантайме не получится,
все делается на этапе компиляции. Поэтому нужно явно
задавать параметр с нужным типом (классом), либо инициализировать.


Тоесть в данном случае не имеет смысла использования generics - достаточно просто конструктор с параметром типа Class.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class MyClass<T>{
      
       Class<T> ct;


       public MyClass(){
       }

       public void method0(){
           if(ct == MyClass1.class)
			method1();
		else if(ct == MyClass2.class)
			method2();
		else if(ct == MyClass3.class)
			method3();
       }
}



Я правильно понял?
...
Рейтинг: 0 / 0
21.04.2013, 23:45:26
    #38234462
YK13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по generic - Как узнать какой тип у generic параметра
YK13Тоесть в данном случае не имеет смысла использования generics


Ну разве только для того чтобы ограничить возможные варианты параметров классами, наследующими какой то базовый тип
...
Рейтинг: 0 / 0
22.04.2013, 04:31:57
    #38234501
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по generic - Как узнать какой тип у generic параметра
YK13Тоесть в данном случае не имеет смысла использования generics
Имеет смысл, достаточно указать переменную generic-типа ( 14210440 ), либо Class-тип ( 14210472 ).
В данном случае - проблема в инициализации переменной Class<T> ct - по-умолчанию
она равна null . В момент сравнения выбросит исключение.

А нельзя ли реализовать какой-нибудь общий интерфейс для всех классов,
которые будут подсовываться в качестве generic-типа?
Если так - необходимость в generic'ах отпадет.
...
Рейтинг: 0 / 0
22.04.2013, 07:23:13
    #38234526
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по generic - Как узнать какой тип у generic параметра
Usman, может до того как давать советы стОит спросить автора:

YK13Спасибо за совет,

К сожалению такой способ мне не подходит, так как используется конструктор с параметром. Мне нужно в завистмости от того какой класс имеет T вызывать соответствующий метод. Можно ли так сделать. Или в java generic классы ВСЕГДА используют конструктор с параметром?А зачем все это? В конечном-то итоге?
...
Рейтинг: 0 / 0
22.04.2013, 10:22:35
    #38234633
GregTk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по generic - Как узнать какой тип у generic параметра
YK13,

https://code.google.com/p/guava-libraries/wiki/ReflectionExplained#TypeToken - вот интересная штука есть может подойдет
...
Рейтинг: 0 / 0
22.04.2013, 16:20:36
    #38235287
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по generic - Как узнать какой тип у generic параметра
YK13,

никак. Только у суперкласса. А зачем?
...
Рейтинг: 0 / 0
22.04.2013, 16:44:30
    #38235359
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по generic - Как узнать какой тип у generic параметра
YK13,

Вам придется сделать кейсы в тех местах, где класс встречается с инстансами своего генерика.
А лучше как-то пересмотреть дизайн.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по generic - Как узнать какой тип у generic параметра / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]