Как использовать универсальную фабрику для универсального типа без предупреждений? - PullRequest
2 голосов
/ 13 марта 2011

У меня есть фабричный метод, такой как

public static <T> Something<T> create(Class<T> clazz) {
    return new Something<T>(clazz);
}

, принимающий аргумент Class.Когда я использую его как в

Something<String> something1 = Something.create(String.class);

все нормально.Но за

Something<List> something2 = Something.create(List.class);

я получаю предупреждение, от которого не могу избавиться.Что бы я ни пытался, я получаю предупреждение или ошибку.

Могу ли я что-нибудь сделать, кроме @SuppressWarnings("unchecked")?

На самом деле, я бы хотел получить

Something<List<?>> something2 = Something.create(List.class);

который я не могу получить без двух забросов и предупреждения.Я использую затмение 3.5.2.

Ответы [ 2 ]

0 голосов
/ 14 марта 2011
@SuppressWarnings("unchecked")
static public <A, B extends A> Class<B> rawcast(Class<A> clazz)
{ 
    return (Class<B>)clazz; 
}

void test()
{
    Class<List<?>> clazz = rawcast(List.class);

    Something<List<?>> something2 = Something.create(clazz);
}
0 голосов
/ 13 марта 2011

Один из способов - предоставить методу фиктивный экземпляр класса, который вы хотели бы использовать для универсального параметра. E.g.:

public static <T> List<T> asList(T a) {
   return new ArrayList<T>();
}
...