我有以下代码:
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) {
}
因为我不想只有字符串..
答案 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;
}