Dart 如何从泛型方法返回两个特定类型? T获取值(int i){ if(T==String)返回“$i”;//错误 返回i;//错误 } void main(){ var s=getValue(1); var i=getValue(1); }
如果Dart 如何从泛型方法返回两个特定类型? T获取值(int i){ if(T==String)返回“$i”;//错误 返回i;//错误 } void main(){ var s=getValue(1); var i=getValue(1); },dart,Dart,如果T是string,我希望getValue返回字符串,否则返回int。如何做到这一点?正如我在评论中提到的,我认为没有任何方法可以使用泛型作为getValue函数的返回类型。即使假设if语句下的返回有效,当List作为类型传递时,也无法尝试返回int i。您将尝试以列表的形式返回int 如果将其更改为dynamic,代码将正常工作,因为它只是将泛型用作另一个参数 dynamicgetvalue(inti){ if(T==String)返回“$i”; 返回i; } void main(){ va
T
是string
,我希望getValue
返回字符串,否则返回int
。如何做到这一点?正如我在评论中提到的,我认为没有任何方法可以使用泛型作为getValue
函数的返回类型。即使假设if语句下的返回有效,当List
作为类型传递时,也无法尝试返回int i
。您将尝试以列表的形式返回int
如果将其更改为dynamic
,代码将正常工作,因为它只是将泛型用作另一个参数
dynamicgetvalue(inti){
if(T==String)返回“$i”;
返回i;
}
void main(){
var s=getValue(1);
var i=getValue(1);
}
您不能将类型参数仅限制为int
或String
,因此它必须接受更多的参数(至少是它们最常见的超类型,对象
,因此基本上是任何类型)
这不是一种特别有用的编码方式。这是可能的,但不推荐:
T获取值(int i){
如果(i是T)返回i;
将“$i”返回为T;
}
如果T
允许,这将返回int
(因此T
是int
中的任何一个,或int
的超级类型,即num
,对象
,动态
或无效
,或围绕任何超类型的任何数量的可比较的
包装),否则,请尝试返回字符串。除非T
是String
(因为我们已经排除了String
的所有超类型),否则将失败并出现类型错误。
您仍然可以将其称为getValue(42)
,并观察其失败,因此类型参数对正确性没有帮助
它不是特别有效。我宁愿做:
dynamicgetvalue(inti,{booltostring=false}){
如果(toString)返回“$i”;
返回i;
}
并称之为:
String x=getValue(42,toString:true);//如果禁用降级,请添加'as String'。
int y=getValue(42);//还有这里的'as int'。
类型参数实际上只是让事情变得更难。无论如何,您都要对结果进行强制转换或类型检查,因此最好在调用点进行转换,而不是引入实际上无法防止误用的类型变量
(我可能只做两个不同的函数,但我认为需要一个函数是有原因的)。我有点困惑。你能解释一下你希望泛型在这种情况下做什么吗?动态
返回值有什么问题?@christophemore我已经更新了代码,你能检查一下吗?可能不是泛型的好地方,但可能其他人会有不同的看法。至少,我没有看到你将泛型用于函数的返回类型。即使假设if语句下的返回有效,如果我将List
作为泛型传递,那么返回int i
也没有什么办法。因为您仍然依赖调用方指定T
,与单独的getStringValue
和getIntValue
函数相比,拥有一个通用的getValue
函数并没有多大的优势(在这一点上,为什么还要麻烦函数呢)。这闻起来有点像X-Y问题:你为什么想要这个?你想解决什么问题?我知道dynamic
和Object
这两种方法都可以工作,但这正好超出了类型声音的目的。我认为有一些方法可以满足我的要求。谢谢你,先生,给了我一个很好的解释,为什么有些东西能用,为什么不能用。但是,在您的第一个代码中(我在发布问题之前也尝试过),有一个编译时错误,您不能从返回类型为t
的方法返回int
。因为我的函数太长,而且只针对特定情况,我需要使用字符串部分,所以我需要一个函数,正如您最后一行所说:)
T getValue<T>(int i) {
if (T == String) return '$i'; // Error
return i; // Error
}
void main() {
var s = getValue<String>(1);
var i = getValue<int>(1);
}