如何限制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通过使用逗号分隔的列表实现多个接口)