2013-04-04 4 views
1

У меня есть требование, где я хочу определить generic class, который реализует generic interface.Определение общего класса, который реализует общий интерфейс

Это мой пользовательский интерфейс карты:

public interface ICache<K, T> { 
    boolean containsKey(K k); 
    T getValue (K key); 
    void remove(K key); 
    void put(K k, T t); 
} 

Это реализация пользовательского класса:

public class CustomCache<K, T> implements ICache<K, T> { 

    private org.infinispan.Cache<K, T> cache; 

    public CustomCache(org.infinispan.Cache<K, T> cache) { 
     this.cache = cache; 
    } 

    @Override 
    public boolean containsKey(K k) { 
     return cache.containsKey(k); 
    } 

    @Override 
    public T getValue(K key) { 
     return cache.get(key); 
    } 

    @Override 
    public void remove(K key) { 
     cache.remove(key); 
    } 

    @Override 
    public void put(K k, T t) { 
     cache.put(k, t); 
    } 
} 

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

Пример метода создания пользовательской карты.

public ICache<?, ?> lookupCache(String cacheName) { 
    ICache<?, ?> cache = null; 
    Cache<?, ?> jCache = new DefaultCacheManager().getCache(); 
    cache = new CustomCache(jCache); 
    return cache; 
} 

Один из способов избежать этого просто использовать, @SuppressWarnings, но я могу исправить то же самое, используя общие.

Использование оператора <>, хотя исправляет это, , но мне нужно сделать его совместимым с 1.6.

+0

Примечание: В Java конвенции, чтобы не использовать «I» -prefix для имен интерфейсов. (AFAIK это соглашение происходит из C-мира.) – Puce

+0

Я уже работаю над рефакторингом. –

ответ

1

предупреда в значительной степени подводит итог: ваш класс Cache это общий тип, то есть он принимает параметры типа, но ваша ссылка к объекту Cache, который называется jCache, не имеет таких параметров типа. Вы должны не только поставлять их в декларации, но и в инициализации, например, так:

cache = new CustomCache<Object, Object>(jCache); 

Это в основном говорит, что у вас есть объект класса CustomCache, но вы не знаете K ни T типа (все же). Все, что вы можете сказать на данный момент, это вы вложите только Object s.

+0

Итак, если я использую это, то посмотрите на образец метода для создания пользовательской карты, тогда подпись метода должна выглядеть так: public ICache lookupCache (String cacheName); –

+0

Подстановочный знак '?' Означает неизвестный тип; см. [Учебник по дженерикам Java] (http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html). – mthmulders

+0

Да, уже известно, почему это произошло? extends Object –

2

Я бы реализовать его как

public class Cache<K, T> implements ICache<K, T> { 
    Map<K, T> map = new HashMap<K, T>(); 

    @Override 
    public boolean containsKey(K k) { 
     return map.containsKey(k); 
    } 

    @Override 
    public T getValue(K key) { 
     return map.get(key); 
    } 

    @Override 
    public void remove(K key) { 
     map.remove(key); 
    } 

    @Override 
    public void put(K k, T t) { 
     map.put(k, t); 
    } 
} 

его как шаблон Adapter

+0

Если вы посмотрите на мое решение, это почти то же самое, но разница здесь заключается в том, что вы определяете новый HashMap, который я не могу сделать, потому что моя внутренняя карта просматривается из какого-то другого источника (здесь контейнер JBOSS). Вот почему я добавил конструктор, и в этом проблема. :) –

1

Не пытаясь, я думаю, что вы можете решить такие ситуации, используя универсальный вспомогательный метод:

private <K, T> ICache<K, T> createCache)(org.infinispan.Cache<K, T> cache){ 
    return new CustomCache<K, T>(cache); 
} 
+0

Работали как шарм. Но было бы более интересно понять, почему прибегать к вспомогательному методу. –

+0

общие вспомогательные методы могут помочь в некоторых ситуациях связать параметры типового типа (например, параметры ввода ввода и вывода или из двух входных аргументов), не зная их фактического типа (например, «?») – Puce

+1

. в этом случае вы говорите «независимо от типа параметров ввода, я хочу, чтобы параметры того же типа были для вывода», который отличается от «?» = "неизвестный тип параметра". – Puce

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