2015-11-07 4 views
0

То, что я пытаюсь сделать:Объявление универсального типа в метод, который определяет класс <?>

getMapType(String.class,String.class); //returns me a MapType of Map<String,String> 

Что я пробовал:

public static <K extends Class<?>, V extends Class<?>> MapType getMapType(K keyClass, V valueClass) { 
    return objectMapper.getTypeFactory().constructMapType(HashMap.class, keyClass,valueClass); 
} 

Это дает мне предупреждение при объявлении K, V расширяет класс.

The type parameter V should not be bounded by the final type Class<?>. Final types cannot be further extended 

Я знаю это означает, что любой класс не может расширить класс потому, что его окончательный класс. Если я удалю extends Class<?>, метод constructMapType (...) завершится неудачно из-за типа. Мой вопрос в том, как я могу реализовать свой метод, чтобы не получить это предупреждение?

ответ

2

Похоже, что вы можете искать

public static <K, V> MapType getMapType(Class<K> keyClass, Class<V> valueClass){ 
    ... 
} 
0

Вы можете смотреть на реализации что-то вроде

import java.util.HashMap; 
import java.util.Map; 



public class HashMapExample { 
    public static <K, V> Map<K,V> getMapType(Class<K> keyClass, Class<V> valueClass) { 
     return new HashMap<>(); 
    } 

    public static void main(String[] args) { 
     Map<String, String> mapType = HashMapExample.getMapType(String.class, String.class); 


    } 
} 

Рассмотрим глядя на некоторые из исходного кода для класса коллекций в Java - это выглядит следующим образом:

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) { 
     return new SynchronizedMap<>(m); 
} 
+0

Я думаю, что цель немного отличается, поскольку речь идет не о построении экземпляра 'Map', но создание' MapType', который представляет собой представление типа Джексона, необходимое для привязки данных, позволяя Джексону узнать подробности типа для привязки данных к (или иногда от). – StaxMan

0

Если типы K и V фактически не упоминается в методе, вы можете просто использовать подстановочные знаки:

public static MapType getMapType(Class<?> keyClass, Class<?> valueClass) { 
    return objectMapper.getTypeFactory().constructMapType(
     HashMap.class, keyClass, valueClass); 
} 
Смежные вопросы