如何限制Java泛型

时间:2013-01-07 17:03:35

标签: 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为String或int或double。这可能吗?

P.S。

我不想使用

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

}

因为我不想只有字符串..

5 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

我不认为有一种方法可以将泛型类型限制为只有String,Integer和Double,但是你可以使用<T extends Comparable> As String,Integer和Double都可以实现Comparable。 但是许多其他类也实现了Comparable,如java.util.Date,

答案 2 :(得分:1)

protected <T extends Object> T getValueForKey(String key);

我不知道你是否可以返回“A String或Integer或Double”等。

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

答案 3 :(得分:0)

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

如果类ClassName是包含protected T getValueForKey(String key)的类,则必须按如下方式声明类ClassName

class ClassName<T extends InterfaceName>

此网址已经提出了一个非常类似的问题:

How to restrict types which are allowed as "T" in a generic class?

答案 4 :(得分:0)

回应@ anfy2002us的评论 - 如果调用者可以知道与给定密钥关联的值的所需类型,那么这个怎么样?

protected <T> T getValueForKey(String key, Class<T> type) {
    return currentStats.containsKey(key) ? type.cast(currentStats.get(key)) : null;
}