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



我想做一些类似于 Scala 通配符的模式匹配,所以我需要实例化一个类型 T 的对象,该对象在调用 equals() - 方法时将始终返回 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>进行比较。所以这就是为什么我需要泛型。

这可能吗?

简单地说,你不能。

当您只有一个通用 T 参数时,无法创建该参数的实例,有关详细信息,请参阅此处。您可以解决此问题,例如通过传递Class实例,但这仍然意味着反射,以及需要默认构造函数或要调用的构造函数的启发式方法。

但是,即使你可以实例化该 T,你也无法为此动态创建一个匿名子类。

最新更新