Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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,我有以下代码: protected <T> T getValueForKey(String key) { T value = null; // currentStats is just a Bundle if (currentStats.containsKey(key)) { return value; } return value; } 受保护的T getValueForKey(字符串键){ T值=null; //cur

我有以下代码:

protected <T> T getValueForKey(String key) {

    T value = null;

    // currentStats is just a Bundle
    if (currentStats.containsKey(key)) {
        return value;
    }
    return value;
}
受保护的T getValueForKey(字符串键){
T值=null;
//currentStats只是一个包
if(currentStats.containsKey(键)){
返回值;
}
返回值;
}
如何设置限制?例如,T是字符串、int或double。这可能吗

附言

我不想用

protected <T extends String> T getValueForKey(String key) {

}
受保护的T getValueForKey(字符串键){
}

因为我不想只使用字符串。

我不认为有办法将泛型类型限制为仅使用字符串、整数和双精度,但可以将
用作字符串、整数和双精度。 但许多其他类也实现了类似的功能,如java.util.Date、

受保护的T getValueForKey(字符串键);
protected <T extends Object> T getValueForKey(String key);
我不知道你是否可以返回“字符串、整数或双精度”等等


您可以添加一些逻辑来检查返回的对象的类名,如果返回的对象不是您想要的类型之一,则引发异常。

由于无法重载返回值,我建议使用不同的访问器方法:

protected int     getIntForKey(String key);
protected double  getDoubleForKey(String key);
protected String  getStringForKey(String key);

没有直接的方法可以做到这一点。
用于类型
T
的类必须有一些共同的限制,即
T
的类都必须实现一些接口-假设这是
InterfaceName

如果类ClassName是包含
受保护的T getValueForKey(字符串键)
的类,则必须按如下方式声明类
ClassName

class ClassName<T extends InterfaceName>
类名
在这个URL上已经提出了一个非常类似的问题:


回应@anfy2002us的评论——如果调用者可以知道与给定键相关联的所需值类型,这个如何

protected <T> T getValueForKey(String key, Class<T> type) {
    return currentStats.containsKey(key) ? type.cast(currentStats.get(key)) : null;
}
受保护的T getValueForKey(字符串键,类类型){
return currentStats.containsKey(key)?type.cast(currentStats.get(key)):null;
}

注意:
==
因为字符串是final.T受保护的getValueForKey(字符串键,类resultClass)。。调用getValue时设置返回类型…如果限制输入值,可以使用两个不同的重载,但是如果限制输出,则没有解决方案。为什么它总是返回
值,即
null
?你能让这个例子更真实吗?@Alex你可以使用一个从BaseValue开始的类层次结构,并从中扩展IntValue、DoubleValue等,并用作返回类型。但是,如何决定从只包含字符串的ResourceBundle创建哪种具体类型呢?这也将允许许多其他类型(例如Date)。我不认为这是被问到的问题。@assylias true,但是你认为除了使用泛型之外还有其他方法吗?不,我不认为有,这将是一个更合适的答案;-)这种方法的危险不在于失去类型安全性吗?更新为使用t extends Objects来限制t类型都必须实现一些共同的接口-它们都实现了某种类型的接口吗?(您甚至可以要求T通过使用逗号分隔的列表实现多个接口)