如何限制Java泛型?

5

I have the following code:

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) {

}

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


(因为我不想只使用字符串..)

2
注意:<T extends String> == <String>,因为String是final的。 - assylias
1
受保护的 <T> T getValueForKey(String key, Class<T> resultClass)。在调用getValue时设置返回类型... - anfy2002us
1
如果你要限制输入值,你可以使用几个不同的重载,但如果你要限制输出,就没有解决方案。 - Louis Wasserman
1
为什么它总是返回 null 值?你能让这个例子更加现实吗? - Peter Lawrey
@Alex 你可以使用一个类层次结构,从BaseValue开始扩展IntValue、DoubleValue等,并使用<T extends BaseValue>作为返回类型。但是,当只包含字符串的ResourceBundle中如何决定创建哪种具体类型呢? - stacker
5个回答

6

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

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

2

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


这也将允许许多其他类型(例如日期)。我认为这不是被问到的内容。 - assylias
@assylias 是的,但您认为除了使用泛型之外还有其他方法吗? - PermGenError
不,我认为没有,这将是一个更合适的答案;-) - assylias

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

我不知道有什么方法可以返回“字符串、整数或双精度浮点数”等。

您可以始终添加一些逻辑来检查返回对象的类名,并在返回的对象不是所需类型之一时抛出异常。


这种方法的危险不就在于你失去了类型安全吗? - Kevin Meredith
更新为使用 T extends Object。 - cowls

0

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

如果类 ClassName 包含 protected T getValueForKey(String key),则必须将类 ClassName 声明如下:

class ClassName<T extends InterfaceName>

这个URL已经有一个非常相似的问题:

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


所有的T类型都必须实现某个共同的接口才能有限制 - 是否有一种接口是它们都实现的?(您甚至可以使用逗号分隔的列表要求T实现多个接口) - A B

0
回应@anfy2002us的评论--如果调用者知道与给定键关联的值的期望类型是可以接受的,那么怎么样?
protected <T> T getValueForKey(String key, Class<T> type) {
    return currentStats.containsKey(key) ? type.cast(currentStats.get(key)) : null;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接