J'ai besoin de la classe Cache qui conserve les paires <TKey key, TValue value>
. Et il est souhaitable que TKey
peut être n'importe quelle classe qui prend en charge l'interface Serializable
et TValue
peut être n'importe quelle classe qui prend en charge Serializable
et mes propres interfaces ICacheable
.Comment utiliser une classe générique (ou une interface) dans une autre classe générique (ou une interface) avec les mêmes paramètres de type de données sans lancer
Il existe une autre classe CacheItem
qui conserve la paire <TKey key, TValue value>
. Je souhaite que la classe Cache possède la méthode void add(CacheItem cacheItem)
. Voici mon code:
public class Cache<TKey extends Serializable,
TValue extends Serializable & ICacheable >
{
private Map<TKey, TValue> cacheStore =
Collections.synchronizedMap(new HashMap<TKey, TValue>());
public void add(TKey key, TValue value)
{
cacheStore.put(key, value);
}
public void add(CacheItem cacheItem)
{
TKey key = cacheItem.getKey();
//Do not compiles. Incompatible types. Required: TValue. Found: java.io.Serializable
TValue value = (TValue) cacheItem.getValue();
//I need to cast to (TValue) here to compile
//but it gets the Unchecked cast: 'java.io.Serializable' to 'TValue'
add(key, value);
}
}
Dans un autre fichier:
public class CacheItem<TKey extends Serializable,
TValue extends Serializable & ICacheable>
{
TKey key;
TValue value;
public TValue getValue()
{
return value;
}
public TKey getKey()
{
return key;
}
}
est-ce que je pouvais faire pour éviter la coulée?
@Sergey J'édité votre code, pour formater le code. C'est beaucoup plus facile à lire et à comprendre :-) J'espère que cela ne vous dérange pas :-) – KLE
KLE, je suis tout à fait d'accord, après avoir édité le code est beaucoup plus facile à lire. – Sergey
Il n'est pas nécessaire d'utiliser I pour les interfaces. le je n'ajoute rien d'utile - personne ne devrait s'en soucier s'il s'agit d'une interface ou non. Il serait particulièrement nul si, pour une raison quelconque, il devait changer à une classe abstraite à une date ultérieure puisque maintenant le nom serait faux (vous ajouteriez probablement une classe abstraite à la place, mais le fait est que vous n'ajoutez rien en Je suis là). – TofuBeer