【问题标题】:How to create a method with a generic return type in dart如何在 dart 中创建具有通用返回类型的方法
【发布时间】:2020-10-10 02:35:47
【问题描述】:

我有一个这样定义的枚举

enum PropertyType { apartment, villa, plot }
enum PossesionType { readyToMove, underConstruction }

我正在尝试创建一个通用方法,当给定字符串作为输入时,它会返回正确的枚举


class Property<T> {
 T getGenericType(String text) {
    switch (text) {
      case 'Ready to move':
        return PossesionType.readyToMove;
        break;
      case 'Apartment':
        return PropertyType.apartment;
        break;
      ....
      ....
      ....  
      default:
        return PossesionType.readyToMove;
 }   
}

我知道这会引发错误,因为它期望返回类型为 T,要在没有泛型的情况下使其工作,我需要编写两个具有不同返回类型的不同函数,但这两个函数基本上会做同样的事情。

  PropertyType getSelectedProperty(String text) {
    switch (text) {
      case 'Apartment':
        return PropertyType.apartment;
        break;
      case 'Villa':
        return PropertyType.villa;
        break;
      case 'Plot':
        return PropertyType.plot;
        break;
      default:
        return PropertyType.apartment;
    }
  }

  PossesionType getSelectedPossession(String text) {
    switch (text) {
      case 'Ready to move':
        return PossesionType.readyToMove;
        break;
      case 'Under Construction':
        return PossesionType.underConstruction;
        break;
      default:
        return PossesionType.readyToMove;
    }
  }

我是泛型新手,所以有人可以帮助我了解如何实现这一目标。

【问题讨论】:

  • 您能否提供更多背景信息?您需要将 String 转换为枚举似乎很奇怪。这似乎也不适合使用泛型。
  • 哦,好吧,实际上我在 UI 中有一组单选按钮,我从后端获取一个字符串值,我需要根据返回的字符串显示一个要选择的单选按钮后端。
  • 这对泛型没有意义。对于静态类型,调用者需要提前知道期望的返回类型。如果您希望返回多种类型,则必须返回 dynamicObject 并要求调用者执行运行时检查以判断返回的内容。
  • 另外,这些选项听起来并不适合单选按钮,因为它们并非都是互斥的。 PropertyTypePossesionType 值似乎应该是独立的,因此使用两组单选按钮(或一组单选按钮和一个复选框)更合适。

标签: generics dart typedef


【解决方案1】:

你需要编写两个不同的函数。

当调用一个泛型函数时,比如T parseProperty&lt;T&gt;(String text) { ... },你需要知道在编译时要返回哪种类型。否则,您必须将 dynamic 作为类型参数传递。

正如您还注意到的,简单地抽象返回类型会使函数难以实现。您必须在每个返回表达式上加上as T,因为没有办法发明一个未知类型的对象。

总而言之,如果您在编译时知道类型,最好使用两个函数,或者如果您不知道,则使用一个返回 Object 的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-02
    • 2020-06-23
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2013-02-13
    相关资源
    最近更新 更多