在 Dart 中,子类如何扩展超类,让子类的泛型类型扩展超类的类型?

Mar*_*rcG 7 generics dart flutter

这是一个Dart 泛型问题。这个问题看起来比较简单,请继续阅读。

我有:

  • 类 SomeController 使用类型 T
  • 类 ExtendedController 使用类型 S
  • ExtendedController 扩展 SomeController
  • S延伸T。

下面的代码不起作用:

import 'package:flutter/material.dart';

class SomeValue {}

class ExtendedValue extends SomeValue {}

abstract class SomeController<T extends SomeValue> extends ValueNotifier<T> {
  SomeController(T value) : super(value);

  factory SomeController.create() {
    return ExtendedController();
  }
}

class ExtendedController extends SomeController<ExtendedValue> {
  ExtendedController() : super(ExtendedValue());
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

The return type 'ExtendedController' isn't a 'SomeController<T>', as defined by the method 'create'.

在行中return ExtendedController();

然后我把它改成这样:

import 'package:flutter/material.dart';

class SomeValue {}

class ExtendedValue extends SomeValue {}

abstract class SomeController<T extends SomeValue> extends ValueNotifier<T> {
  SomeController(T value) : super(value);

  factory SomeController.create() {
    return ExtendedController();
  }
}

class ExtendedController<S extends ExtendedValue> extends SomeController<S> {
  ExtendedController() : super(ExtendedValue());
}
Run Code Online (Sandbox Code Playgroud)

仍然不起作用,但现在我收到另一个错误: The constructor returns type 'ExtendedValue' that isn't of expected type 'S'.

这次在super(ExtendedValue());排队。

Gün*_*uer 3

显式转换修复了它:

  factory SomeController.create() {
    return ExtendedController() as SomeController<T>;
  }
Run Code Online (Sandbox Code Playgroud)

https://groups.google.com/a/dartlang.org/forum/#!topic/misc/bVRHdagR8Tw

或者你可以使用

  static create() {
    return ExtendedController() as SomeController<T>;
  }
Run Code Online (Sandbox Code Playgroud)

有了可选,new就不再有区别了。

  • 有趣的是,对于可选的 new 来说,确实不再有区别了。严格地说,类不应该知道它们的子类,如果这是 Java,我将创建一个单独的 SomeControllerFactory 类来封装返回 SomeController 的子类之一的逻辑。我想我对打破 Dart 中的最佳实践感觉更好,因为其中有“工厂”这个词。当然,我刚才说的并不是那么重要,但是我觉得第一种形式在语义上更清晰一些。 (3认同)