Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-泛型&;通配符&;接口与实现_Java_Generics - Fatal编程技术网

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

我有一个关于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(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