Получение класса Java универсальная, и интерфейсная реализация дженериков

Попробуйте это в своем settings.py при использовании Python 2:

FILE_UPLOAD_PERMISSIONS = 0644

В восьмеричных числах Python 3 должен запуститься с 0o, таким образом, строка была бы:

FILE_UPLOAD_PERMISSIONS = 0o644

для получения дополнительной информации см. документацию .

5
задан niklassaers 24 August 2009 в 07:27
поделиться

5 ответов

Вы не можете получить тип.

Универсальные шаблоны реализуются с использованием так называемого стирания типа .

Когда создается экземпляр универсального типа, компилятор переводит эти типы с помощью техника, называемая стиранием шрифта - процесс, в котором компилятор удаляет все информация, относящаяся к параметрам типа и введите аргументы внутри класса или метод. Стирание типов включает Java приложения, которые используют дженерики для поддерживать двоичную совместимость с Библиотеки и приложения Java, которые были созданы до дженериков.

Суть этого заключается в том, что информация о типе используется компилятором и отбрасывается, следовательно, недоступна во время выполнения.

Что касается принудительного T реализует Serializable , вы просто необходимо следующее:

public class MyClass<T extends Serializable>)
{
  public void function(T obj) 
  {
    ...
  }
}

Это просто ссылка на - это отношение , поэтому класс, реализующий Serializable , , является Serializable и можно передать в функцию .

7
ответ дан 18 December 2019 в 10:47
поделиться

Что-то вроде этого должно сработать .

private Class<T> dataType;
Type type = getClass().getGenericSuperclass();
if (type instanceof ParameterizedType) {
    ParameterizedType paramType = (ParameterizedType) type;
    dataType = (Class<T>) paramType.getActualTypeArguments()[0];
} else if (type instanceof Class) {
    dataType = (Class<T>) type;
}
3
ответ дан 18 December 2019 в 10:47
поделиться

Вы не можете использовать T.class, потому что java на самом деле не знает, какой класс T находится во время выполнения.

Вся эта информация теряется при компиляции.

Чтобы получить объект класса для T, вы можете либо вызвать getClass () для экземпляра T (если у вас есть доступ к нему), либо потребовать от пользователя передать объект класса в качестве аргумента функции , например:

void function(Class<T> c)
1
ответ дан 18 December 2019 в 10:47
поделиться

Это невозможно без уловок. Часто задаваемые вопросы по Java Generics предлагают идею обходного пути.

0
ответ дан 18 December 2019 в 10:47
поделиться

вы делаете это:

public class MyClass<T implements Serializable) {

   void function(Class<T> tc) {
      ...
   }
}

Обычно вы должны передать класс во время выполнения, чтобы видеть это. Вы также можете сделать что-то вроде этого:

public class MyClass<T implements Serializable) {
   Class<T> ct; 
   public MyClass(Class<T> ct){this.ct = ct;}

   void function() {
       ... //you know what the class is here
   }
}

Это немного раздражает, но в целом не такая уж большая проблема.

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

public class MyClass<T implements Serializable) {
   Class<T> ct; 
   public MyClass(Class<T> ct){this.ct = ct;}

   void function() {
       ... //you know what the class is here
   }
}

Это немного раздражает, но в целом не так уж и сложно.

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

public class MyClass<T implements Serializable) {
   Class<T> ct; 
   public MyClass(Class<T> ct){this.ct = ct;}

   void function() {
       ... //you know what the class is here
   }
}

Это немного раздражает, но в целом не так уж и сложно.

5
ответ дан 18 December 2019 в 10:47
поделиться
Другие вопросы по тегам:

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