我希望有一种方法具有类似于method(T1 t1, T2 t2)
T2是-T1和/或T1是-T2 的签名
.我不希望T1和T2都是T的情况,但两者都不是 - 另一个.我希望最允许的类型在继承树中以T1或T2的最高值为界.我使用的是Java 6.
下面是尝试显示一些所需的用例
class Experiment { static List genericList = new ArrayList(); static ArrayList arrayList = new ArrayList(); static class Test1 { } static class Test2 extends Test1 { } static class Test3 extends Test1 { } staticT experiment0(T expected, T actual) { return actual; } /** Almost works, but want arbitrary ordering. Cannot overload due to erasure. */ static S experiment1(T expected, S actual) { return actual; } private static void experimentDriver() { // good, allowed List l = experiment0(genericList, arrayList); // bad, allowed; want compile-time error Object o = experiment0(new String(), new Integer(0)); // good, allowed Test1 test1 = experiment1(new Test1(), new Test3()); String string = experiment1(new String(), new String()); List list = experiment1(genericList, new ArrayList()); // good, disallowed experiment1(new Test2(), new Test3()); experiment1(new Test3(), new Test2()); experiment1(new Integer(0), new String()); experiment1(new ArrayList(), new LinkedList()); // bad, disallowed; want either order experiment1(new Test3(), new Test1()); experiment1(new ArrayList(), genericList); } }
我知道我可以用签名来实现类似的东西,
experiment(Class
但这会迫使程序员明确提到允许的最高类型,当我想用语言推断它时.
请注意,较近的解决方案不能简单地过载,因为它们的擦除是相同的.
我希望我已经提供了足够的信息来传达我想要的东西.我意识到这在Java中可能是不可能的,但我希望它是可行的.这也是我在这个论坛上的第一个问题,所以如果我在不知不觉中违反任何规则,我会提前道歉并感谢您的耐心等待!