Определение универсального набора вводит параметрический усилитель во времени выполнения (Отражение Java)

Вообще говоря, из нескольких технических газет лучших практик превосходства, которые я прочитал, 80% для нового кода в модульных тестах являются точкой, которая приводит к лучшему возврату. Выход за предел того % CC приводит к более низкой сумме дефектов для проявленного усилия. Это - лучшая практика, которая используется многими крупнейшими корпорациями.

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

5
задан akarnokd 14 July 2009 в 20:59
поделиться

4 ответа

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

(Ссылка на соответствующий раздел Анжелики Лангер FAQ по Java Generics , который должен ответить практически на все вопросы, которые вы могли бы задать о Java-дженериках:)

Однако вас действительно не интересует тип объекта - вас интересует в виде поля . Я неправильно прочитал вопрос, и хотя ответ был принят, я надеюсь исправить это, исправив его сейчас :)

Если поле не использует параметр типа, это можно сделать. Например:

import java.lang.reflect.*;
import java.util.*;

public class Test
{
    public List<String> names;

    public static void main(String [] args)
        throws Exception // Just for simplicity!
    {
        Field field = Test.class.getDeclaredField("names");

        ParameterizedType type = (ParameterizedType) field.getGenericType();

        // List
        System.out.println(type.getRawType());

        // Just String in this case
        for (Type typeArgument : type.getActualTypeArguments())
        {
            System.out.println("  " + typeArgument);
        }
    }
}

Если бы поле принадлежало классу T с полем List , тогда вам нужно было бы знать аргумент типа для экземпляра, чтобы знать аргумент типа для коллекции.

Однако преобразовать это в требуемый код несколько сложно - вам действительно нужно знать аргумент типа в точке класса коллекции. Например, если кто-то объявил:

public class StringCollection implements Collection<String>

, а затем имел поле типа StringCollection , само это поле не имело бы никаких аргументов типа. Вы' d затем необходимо рекурсивно проверять getGenericSuperType и getGenericInterfaces , пока вы не найдете то, что вам нужно.

Это действительно будет нелегко, хотя это возможно. На вашем месте я бы попытался изменить ваш дизайн, чтобы он вам не понадобился.

17
ответ дан 18 December 2019 в 06:12
поделиться

Copied from my post at: https://stackoverflow.com/questions/1004022/java-generic-class-determine-type/1005283#1005283

I've used a similar solution to what he explains here for a few projects and found it pretty useful.

http://blog.xebia.com/2009/02/07/acessing-generic-types-at-runtime-in-java/

The jist of it is using the following to determine the type parameter at runtime:

public Class returnedClass {
  ParameterizedType parameterizedType =
    (ParameterizedType) getClass().getGenericSuperClass();
 return (Class) parameterizedtype.getActualTypeArguments()[0];
}
0
ответ дан 18 December 2019 в 06:12
поделиться

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

class Thing {
  List<Persistable> foo;
}


Field f = Thing.class.getDeclaredField("foo");
if( Collection.class.isAssignableFrom( f.getType() ) {
   Type t = f.getGenericType();
   if( t instanceof ParameterizedType ) {
     Class genericType = (Class)((ParameterizedType)t).getActualTypeArguments()[0];
     if( Persistable.class.isAssignableFrom( genericType ) )
         return true;
   }
}

Здесь много вещей, которые могут пойти не так, например, если у вас

Class Thing<T> {
  List<T> foo;
}

, то вышеуказанное не будет работать.

9
ответ дан 18 December 2019 в 06:12
поделиться

Общий тип поля, из которого вы читаете объект, можно получить с помощью Field.getGenericType . Обратите внимание, что поле может быть необработанным типом, быть редким типом (универсальным, но с общим аргументом, который является исходным), использовать тип экземпляра, использовать подстановочные знаки и т. Д.

0
ответ дан 18 December 2019 в 06:12
поделиться
Другие вопросы по тегам:

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