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

时间:2019-01-22 13:13:05

标签: java generics

我想做一些类似于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>进行比较。这就是为什么我需要泛型。

有可能吗?

1 个答案:

答案 0 :(得分:1)

简单地说,你不能。

如果只有通用T参数,则无法创建该实例,请参见here以获得详细信息。您可以解决此问题,例如,通过传递Class的实例,但这仍然意味着反思,以及对默认构造函数或调用该构造函数的启发式方法的需求。

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