首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在构造函数中键入泛型参数?

如何在构造函数中键入泛型参数?
EN

Stack Overflow用户
提问于 2020-12-23 05:29:01
回答 1查看 132关注 0票数 0

在许多面向对象语言(如Dart或Java )中,可以参数化传递给对象构造函数的参数。在构造函数中处理意外参数类型的最佳方法是什么?例如,在这个Dart代码段中,使用了加号运算符(+),并且假设这只在ints或字符串的上下文中是有意义的:

代码语言:javascript
复制
class Wrap <T> {
  OK;

  factory Wrap (T a) {
    if (a is String) print ("Type is String");
    else if (a is int) print ("Type is int");

    return Wrap ._ (a);
  }

  Wrap ._ (this.a);
}

main () {
  / *
    var obj = Wrap <Map <int, String >> (<int, String> {0: '1'});
    var obj = Wrap <String> ('2');
    var obj = Wrap <int> (2);
  * /
  print (obj.a + obj.a);
}

我对OOP处理这个问题的方法很感兴趣(如果可能的话,特别是在Dart和Java中)。

我考虑过的一些想法是:

  • 在构造函数中返回null。然而,看起来有些语言,比如Java,不允许这个
  • 有一些方便的方法来优雅地创建对象,即使类型是意外的
EN

回答 1

Stack Overflow用户

发布于 2021-01-02 02:04:51

正如@评论的那样,当前处理泛型类的类型参数中的意外类型的最好和最安全的方法是抛出异常。

虽然这并不妨碍实例的创建,但异常已经足够了,因为它通知程序员某些地方出错了,只给了他一个选项来处理错误/异常,否则程序就会终止。

以下是上文所述的一个例子:

代码语言:javascript
复制
class Wrap<T> {
  T a;

  factory Wrap(T a) {
    if (!(T == String || T == int))
      throw(Error_Wrap("Invalid type ${T}"));
    return Wrap._(a);
  }

  Wrap._(this.a);
}

class Error_Wrap extends Error {
  String error;
  Error_Wrap(this.error);

  @override
  String toString() => error;
}

main () {
  var obj;
  try {
    obj = Wrap<Map<int, String>>(<int, String>{ 0 : '2'});
  } on Error_Wrap catch(e, s) {
    print("${e}\n${s}");
    return;
  }

  print(obj.a + obj.a);
}

谢谢@AnilRedshift编辑并重新打开这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65419447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档