在Dart中,子类如何扩展超类,具有子类的泛型类型扩展了超类的类型?

问题描述 投票:2回答:2

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

我有:

  • class SomeController使用类型T.
  • class 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());线。

generics dart flutter
2个回答
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
投票

我们来看第一个错误: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());
  }
}

希望我的解释在某种程度上有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.