代码之家  ›  专栏  ›  技术社区  ›  Internet Friend

Java中类型擦除的构造函数设计

  •  3
  • Internet Friend  · 技术社区  · 16 年前

    昨天,我设计了一个Java类,我想用各种泛型类型的列表来初始化它:

    TheClass(List<String> list) {
       ...
    }
    
    TheClass(List<OtherType> list) {
       ...
    }
    

    这不会编译,因为构造函数具有相同的擦除。

    我只是用不同的工厂方法来代替他们的名字:

    public static TheClass createWithStrings(List<String> list)
    public static TheClass createWithOtherTypes(List<OtherType> list)
    

    这并不是最理想的,因为没有一个明显的位置提供创建实例的所有不同选项。

    我试图寻找更好的设计思路,但意外地发现很少有结果。围绕这个问题还有哪些其他的设计模式?

    3 回复  |  直到 9 年前
        1
  •  2
  •   Gerard    9 年前

    我很想知道这个问题的解决方法。

    我经常遇到同样的问题,通常通过引入一个伪参数(例如 Void )对于构造器来说,这当然不是最优雅的解决方案,但却是迄今为止我所知道的最好的解决方案。

        2
  •  1
  •   Tom Hawtin - tackline    16 年前

    注意,可以在带有删除的泛型参数上添加方法重载,尽管通配符会使其更为困难。

    我建议使用基于类型解释的名称创建方法。 String 本身没有什么意义。 createWithThingNames ,或者别的什么。

    一些静态类型的语言根本没有方法重载(故意的)。

        3
  •  0
  •   Istao    16 年前

    不同的解决方案:

    1)带标签

    class TheClass
    {
     TheClass(String[] strings)   {}
     TheClass(Object[] others) {}
    }
    

    2)有仿制药

    class TheClass<P>
    {
     TheClass(P generic) {}
    }