我在一个泛型函数的类层次结构中遇到了问题。
我需要强制规定,在函数中指定的两个类T
和U
中,一个是另一个的子类。
但令人惊讶的是,我发现构造<T extends U>
根本不强制要求U
和T
之间存在父子关系。
相反,它还允许T
和U
是同一类型。
这会引起问题,因为如果U extends T
的情况下,Java不会指示错误,而是愉快地推导出两个对象都是T
类型(毫无疑问),然后编译并运行代码而没有任何抱怨。
下面是一个说明该问题的例子:
public class MyClass {
public static void main(String args[]) {
Foo foo = new Foo();
Bar bar = new Bar();
// This code is written as intended
System.out.println( justTesting(foo, bar) );
// This line shouldn't even compile
System.out.println( justTesting(bar, foo) );
}
static interface IF {
String get();
}
static class Foo implements IF {
public String get(){return "foo";}
}
static class Bar extends Foo {
public String get(){return "bar";}
}
static <G extends IF , H extends G> String justTesting(G g, H h) {
if (h instanceof G)
return h.get() + " (" + h.getClass() + ") is instance of " + g.getClass() + ". ";
else
return "it is the other way round!";
}
}
以下是输出结果:
bar (class MyClass$Bar) is instance of class MyClass$Foo.
foo (class MyClass$Foo) is instance of class MyClass$Bar.
我需要确保编译器能够观察到通用类之间的父子关系。有没有办法实现这一点?
instanceof
检查、new
调用、数组分配等。我真的很惊讶(h instanceof G)
能够编译通过。 - Silvio Mayolo