我想做一些类似于Scala的通配符来进行模式匹配,
因此我需要实例化一个类型为T
的对象,该对象在调用true
-方法时将始终返回equals()
。
我知道这是一种黑客行为,因此,如果我尝试在该对象上调用任何其他函数,我的计算机也可能会大火,唯一重要的是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>
进行比较。这就是为什么我需要泛型。
有可能吗?
答案 0 :(得分:1)
简单地说,你不能。
如果只有通用T参数,则无法创建该实例,请参见here以获得详细信息。您可以解决此问题,例如,通过传递Class
的实例,但这仍然意味着反思,以及对默认构造函数或调用该构造函数的启发式方法的需求。
但是,即使可以实例化该T,也不能为该实例动态创建一个匿名子类。