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);
}