如何在构造函数中对泛型参数进行类型检查?

flvlnr44  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(334)

在许多oop语言中,如dart或java,可以参数化传递到对象构造函数中的参数。在构造函数中处理意外参数类型的最佳方法是什么?例如,在这个dart代码段中,plus运算符( + )是使用的,假设只有在int或字符串的上下文中才有意义:

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,[不允许这样][1]
有一些方便的方法来优雅地创建对象,即使类型是意外的

von4xj4u

von4xj4u1#

正如@charlie armstrong所评论的,当前处理泛型类的type参数中的意外类型的最好和最安全的方法是抛出异常。
尽管这并不能阻止示例的创建,但是异常已经足够了,因为它通知程序员出了问题,只给他一个选项来处理错误/异常,否则程序将终止。
下面是上述内容的一个例子:

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编辑并重新打开问题。

相关问题