Java-泛型&;通配符&;接口与实现
我有一个关于Java泛型的问题。假设我有以下界面:Java-泛型&;通配符&;接口与实现,java,generics,Java,Generics,我有一个关于Java泛型的问题。假设我有以下界面: public static class Something<T> { public void set(T t) { } } public static interface Manager<T> { public void add(final String key, final Something<T> o); public Something<T> get(fi
public static class Something<T> {
public void set(T t) {
}
}
public static interface Manager<T> {
public void add(final String key, final Something<T> o);
public Something<T> get(final String key);
}
公共静态类{
公共无效集(T){
}
}
公共静态接口管理器{
public void add(最终字符串键,最终字符串o);
public Something get(最终字符串键);
}
用法示例:
final Manager<Number> m = ...;
m.add("key", new Something<Number>());
m.get("key").set(new Integer(5));
final Manager m=。。。;
m、 添加(“key”,newsomething());
m、 get(“key”).set(新的整数(5));
我还希望能够添加Something
,Something
。。。到a管理器
。我想说我必须更改add函数的签名:
public static interface Manager<T> {
public void add(final String key, final Something<? extends T> o);
public Something<T> get(final String key);
}
final Manager<Number> m = ...;
m.add("key", new Something<Integer>());
m.get("key").set(new Integer(5));
公共静态接口管理器{
公共无效添加(final String key,final Something在您的类中,您总是使用Something为什么不能将接口中的get方法更改为publicSomething@HariShankar这将返回一些东西我对泛型相当陌生。我一直认为当泛型就位时可以避免强制转换。所以这不是真的吗?这是只有使用强制转换才能正确解决问题?从实用的角度来看,我的建议是:使用泛型,但要少用。通常一级泛型(如“”、无扩展或超级)就足够了,更多的东西都过于复杂,使您的代码不可读。重点是“通常”。;-)因此,换句话说,您是说对于外部世界/API,泛型必须如预期的那样(如果必要,使用通配符),但是对于实现,最好保持尽可能简单?这是一个哲学问题,但我会保持泛型尽可能简单(当然,他们必须满足设计和第三方API)看到太多的类有很多未记录的(!)泛型,没有程序员愿意使用。
public static class ManagerImplementation<T> implements Manager<T> {
protected HashMap<String, Something<T>> map = new HashMap<String, Something<T>>();
public void add(final String key, final Something<? extends T> o) {
map.put(key, o); // <--- here
}
public Something<T> get(final String key) {
return map.get(key);
}
}
public static class ManagerImplementation<T> implements Manager<T> {
protected HashMap<String, Something<? extends T>> map = new HashMap<String, Something<? extends T>>();
public void add(final String key, final Something<? extends T> o) {
map.put(key, o);
}
public Something<T> get(final String key) {
return map.get(key); // <--- here
}
}
return (Something<T>) map.get(key); // <--- here