2013-07-20 3 views
-1

У меня естьТип преобразования

private HashMap<Key<?>, Val<?>> myMap; 

На этой карте под указанным key<T> всегда val<T> (тот же T). Я хочу создать функцию, которая использует эту информацию, и автоматически дает мне значение, преобразованное в заданный тип. Является ли это возможным? Что-то вроде этого:

public class MyClass{ 
    private HashMap<Key<?>, Val<?>> myMap; 
    public Val<T> getValue(Key<T> key) { 
     return (Val<T>) myMap.get(key) 
    } 

(. Тип T не дано в классе)

+0

@ downvoters и близкие избиратели: пожалуйста, exp пролежала. Хороший вопрос ИМО. Ничего неясно, как доказывает существование принятого ответа. +1 – EJP

ответ

2

Есть два возможных решения этой:

  1. Определение общего типа по методу:

    public class MyClass{ 
        private HashMap<Key<?>, Val<?>> myMap; 
        public <T> Val<T> getValue(Key<T> key){ 
         return (Val<T>) myMap.get(key) 
        } 
    
  2. Определение общего типа на классе:

    public class MyClass<T> { 
        private HashMap<Key<?>, Val<?>> myMap; 
        public Val<T> getValue(Key<T> key) { 
         return (Val<T>) myMap.get(key); 
        } 
    } 
    
+0

+1. Я думаю, что вариант № 1 - это то, что ищет ОП. – ruakh

+1

(На самом деле, подумайте об этом - вариант №2 даже не имеет смысла. Если в классе может быть указано '' ', то' myMap' будет объявлен как 'HashMap , Val >'. Но OP указывает, что это невозможно, потому что 'T' будет отличаться для разных элементов' myMap'.) – ruakh

+0

Да, хороший момент :-) – ekj

0

Ваше предложение под «что-то вроде этого» будет работать правильно. Просто используйте его.

+0

Это не работает, так как T может быть определено только в классе. Здесь T должен определяться каждый раз, когда вы выполняете функцию, а не во время компиляции. –

+0

Вы пробовали? Я думаю, что это будет, учитывая правила для дженериков. – tbodt

+0

У меня есть. Он имеет проблемы с классом Т. Невозможно найти символ T. –

Смежные вопросы