【问题标题】:Generic paramater that itself is generic本身是泛型的泛型参数
【发布时间】:2021-09-27 20:18:23
【问题描述】:

我有一个在T extends SomeClass<A> 上通用的工厂类。但问题是A 在类级别不为人所知,而仅在方法级别。为了让自己更清楚一些代码:

class Factory<T extends SomeClass<A>> { // Don't know A here
  T<A> Function<A>(A arg) _constructor; // Function that produces my T's and is generic over A
  Factory(this._constructor);
  
  T<String> newString(String arg){      // A is only known here
    return _constructor(arg);
  }
  T<int> newInt(int arg){
    return _constructor(arg);
  }
}

这显然不是合法的 Dart 代码,但是使用 Dart 的泛型甚至可以实现这种效果,还是需要代码生成?我尝试使用扩展方法,但它们并没有解决_constructor 具有返回类型T&lt;A&gt; 的问题。而且我明确不想/不能使用T constructor&lt;A, T extends SomeClass&lt;A&gt;&gt;(A args)

编辑:我认为我真正要求的是更高种类的类型,这在 Dart 中绝对不可能,并且正在就这个问题进行讨论 (https://github.com/dart-lang/language/issues/1655)。如果我对此事的理解不正确,请见谅。

【问题讨论】:

    标签: dart


    【解决方案1】:

    这不是 Dart 当前的工作方式直接。 Dart 的泛型只是一阶,因此您不能将本质上是函数的类型作为类型参数传递给类型。只有普通类型可以是类型参数。

    这里有一个通用工厂类。它创建的对象类型是在类级别定义的(为方便起见,我们假设SomeClass这里是Iterable,所以它是一个集合工厂类,你可以选择,例如ListSetQueue 作为要创建的集合类型),然后在调用工厂方法时选择这些集合的元素类型。 那是行不通的,因为没有 type 类可以存储在类类型参数中,以后可以允许这种用法。

    我可能会为此使用单独的类和普通继承:

    abstract class Factory {
      Iterable<T> Function<T>(T) _constructor;
      Factory(Iterable<T> Function<T>(T) constructor) 
          : _constructor = constructor;
      Iterable<String> newString(String arg) => _constructor<String>(arg);
      Iterable<int> newINt(int arg) => _constructor<int>(arg);
    }
    class ListFactory extends Factory {
      ListFactory(List<T> Function<T>(T) constructor) : super(constructor);
      List<String> newString(String arg) => 
          super.newString(arg) as List<String>;
      List<int> newInt(int arg) => 
          super.newInt(arg) as List<int>;
    }
    

    【讨论】:

    • 如果无论如何我都必须重写每个方法来进行类型断言,那么我的想法就没有什么意义了,我最好还是使用代码生成来提高生产力和性能。
    猜你喜欢
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多