在Dart中,子类如何扩展具有父类的通用类型的超类?

时间:2018-09-01 03:33:06

标签: generics dart flutter

这是一个 Dart Generics 问题。这个问题看起来似乎很简单,请继续阅读。

我有:

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

我收到错误消息:

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

仍然无法正常工作,但现在又出现另一个错误: The constructor returns type 'ExtendedValue' that isn't of expected type 'S'.

这次在super(ExtendedValue());行中。

2 个答案:

答案 0 :(得分:2)

一个显式强制修复:

  factory SomeController.create() {
    return ExtendedController() as SomeController<T>;
  }

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

或者您可以使用

  static create() {
    return ExtendedController() as SomeController<T>;
  }

使用可选的new不再有区别。

答案 1 :(得分:1)

让我们来第一个错误: The return type 'ExtendedController' isn't a 'SomeController<T>', as defined by the method 'create'.

根据定义,这表明ExtendedController方法中的create不是预期收益类型

create是此处的工厂方法,期望返回类型为SomeController

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

我们也不能这样更改,因为SomeController是一个抽象类。 因此,我将factory方法移至ExtendedController。

class SomeValue {}

class ExtendedValue extends SomeValue {}

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

class ExtendedController extends SomeController {
  ExtendedController(ExtendedValue value) : super(value);

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

希望我的解释在一定程度上有所帮助。