我想做一些类似于 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,你也无法为此动态创建一个匿名子类。