这是一个 Dart Generics 问题。这个问题看起来似乎很简单,请继续阅读。
我有:
以下代码不起作用:
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());
行中。
答案 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());
}
}
希望我的解释在一定程度上有所帮助。