5

我有以下代码:

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 例如。这可能吗?

附言

我不想用

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

}

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

4

5 回答 5

6

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

protected int     getIntForKey(String key);
protected double  getDoubleForKey(String key);
protected String  getStringForKey(String key);
于 2013-01-07T17:08:33.633 回答
2

我认为没有办法将泛型类型限制为仅 String、Integer 和 Double,但您可以使用<T extends Comparable>As String、Integer 和 Double 都实现 Comparable。但是许多其他类也实现了类似 java.util.Date 的 Comparable,

于 2013-01-07T17:05:26.007 回答
1
protected <T extends Object> T getValueForKey(String key);

我不知道无论如何你可以返回“A String or an Integer or a Double”等。

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

于 2013-01-07T17:07:36.470 回答
0

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

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

class ClassName<T extends InterfaceName>

在这个 URL 上已经提出了一个非常相似的问题:

如何限制泛型类中允许作为“T”的类型?

于 2013-01-07T17:12:04.010 回答
0

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

protected <T> T getValueForKey(String key, Class<T> type) {
    return currentStats.containsKey(key) ? type.cast(currentStats.get(key)) : null;
}
于 2013-01-07T20:10:49.480 回答