在Dart中,将动态转换为给定类型或返回null的语法上不错的方法吗?

And*_*nko 5 dart

我有一个dynamic x,我想分配xT sif x is T,否则要分配nulls。具体来说,我想避免必须键入x两次,并避免创建临时目录。(例如,我不想String s = map['key'] is String ? map['key'] : null;一遍又一遍地写,因为我将有很多这样的表达式。)我不希望有任何运行时错误的可能性。

以下作品:

class Cast<T> {
  T f(x) {
    if (x is T) {
      return x;
    } else {
      return null;
    }
  }
}

// ...

dynamic x = something();
String s = Cast<String>().f(x);
Run Code Online (Sandbox Code Playgroud)

有没有一种语法上更好的方法可以做到这一点?

Mat*_*Pag 15

我正在使用具有 Dart null 安全性的那些(Dart SDK >= 2.12):

T? castOrNull<T>(dynamic x) => x is T ? x : null;

T castOrFallback<T>(dynamic x, T fallback) => x is T ? x : fallback;
Run Code Online (Sandbox Code Playgroud)


Mag*_*s W 14

我使用以下实用程序函数,它允许可选的回退值和错误日志记录。

T tryCast<T>(dynamic x, {T fallback}){
    try{
        return (x as T);
    }
    on CastError catch(e){
        print('CastError when trying to cast $x to $T!');
        return fallback;
    }
}
Run Code Online (Sandbox Code Playgroud)
var x = something();
String s = tryCast(x, fallback: 'nothing');
Run Code Online (Sandbox Code Playgroud)


dav*_*ady 13

只需使用as关键字

final tweet = tweets[index] as Tweet;
Run Code Online (Sandbox Code Playgroud)

  • “as”是“强制类型转换”并且不安全 (11认同)
  • 这不能在任何地方使用。如果类型不是给定类型,则它不会返回 null。相反,它会抛出错误。仅当您确定类型时才应该使用它。 (3认同)

om-*_*-ha 9

这个隐藏的宝石是由 Dart-Lang 的维护者之一提供的

extension AsExtension on Object? {
  X as<X>() => this as X;
  X? asOrNull<X>() {
    var self = this;
    return self is X ? self : null;
  }
}

extension AsSubtypeExtension<X> on X {
  Y asSubtype<Y extends X>() => this as Y;
}

extension AsNotNullExtension<X> on X? {
  X asNotNull() => this as X;
}

// example
void main() {
  num? n = 1 as dynamic;
  n.as<int>().isEven;
  n.asSubtype<int>().isEven; // `n.asSubtype<String>()` is an error.
  n.asNotNull().floor();
  n.asOrNull<int>()?.isEven; // Corresponds to `(n as? int)?.isEven`.
}
Run Code Online (Sandbox Code Playgroud)

注意:如果您的对象属于类型dynamic,则必须Object?先对其进行强制转换。对此的解释可以在这里找到:第一个由 dart 维护者 @Google Erik 提出,第二个由社区成员提出。基本上,它归结为 dart 不在接收以下三种类型之一时调用扩展方法:dynamicNever如此处void所述。


Gün*_*uer 7

Dart 2具有通用功能,允许

T cast<T>(x) => x is T ? x : null;
Run Code Online (Sandbox Code Playgroud)
dynamic x = something();
String s = cast<String>(x);
Run Code Online (Sandbox Code Playgroud)

你也可以使用

var /* or final */ s = cast<String>(x);
Run Code Online (Sandbox Code Playgroud)

String推断出s

  • 如果你在 dart 中打开空安全性。会是“T”吗?cast&lt;T&gt;(x) =&gt; x 是 T 吗?x:空;` (3认同)
  • 您还应该能够执行String s = cast(x);并将类型参数转换为从上下文推断出的cast。 (2认同)
  • 这个函数在哪里定义的? (2认同)
  • @LeresAldtai 在我的回答中;-) 你需要自己定义它。 (2认同)

Rya*_*ert 5

前两个帖子的组合,没有日志记录。

未提供时,回退默认为 null。

T cast<T>(dynamic x, {T fallback}) => x is T ? x : fallback;
Run Code Online (Sandbox Code Playgroud)