这是一个Dart泛型问题。这个问题似乎比较简单,请继续阅读。
我有:
以下代码不起作用:
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());
线。
一个显式的演员修复它:
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
,没有任何区别了。
我们来看第一个错误: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());
}
}
希望我的解释在某种程度上有所帮助。