代码之家  ›  专栏  ›  技术社区  ›  Markus Appel

实例化类型参数和重写方法

  •  1
  • Markus Appel  · 技术社区  · 7 年前

    我想做一些类似于scala的通配符的事情来进行模式匹配, 所以我需要实例化一个类型的对象 T 总会回来的 true 当呼叫 equals() -方法。

    我知道这是一种黑客行为,所以如果我试图调用这个对象上的任何其他函数,我的计算机可能会起火,唯一重要的是 等式() .

    到目前为止我有:

    public void match(Object toMatch, Effect0 effect) {
       val bothNull = toMatch == null && value == null;
    
        val equals = toMatch != null && toMatch.equals(value);
    
        if(bothNull || equals) {
            effect.f();
        }
    }
    

    public static Object any() {
        return new Object() {
            @Override
            public boolean equals(Object o) {
                return true;
            }
        };
    }
    

    但我得想办法抬起来 any() 成类型 T .

    用法如下:

    myClass.match(new MyClass(any(), "foo", "bar", any()), () -> ...);
    

    重要的是,我不能,例如,比较 Pair<String, Integer> 用一个 Pair<Integer, String> . 所以我需要仿制药。

    有可能吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   GhostCat    7 年前

    简单地说,你不能。

    当您只有一个通用的T参数时,无法创建它的实例,请参见 here 详情。您可以解决这个问题,例如通过传递 Class 大约,但这仍然意味着反射,以及对默认构造函数的需要,或者对构造函数调用的启发式方法。

    但即使可以实例化T,也不能为此动态创建匿名子类。