【发布时间】:2014-04-30 02:02:38
【问题描述】:
extends 的层次结构是什么?例如,数字、整数等。
例如,
public class Foo<extends Integer>
{.....}
这会接受哪些类型?
类中最高的类型是什么? 类中最低的类型是什么?
【问题讨论】:
标签: java class generics extends
extends 的层次结构是什么?例如,数字、整数等。
例如,
public class Foo<extends Integer>
{.....}
这会接受哪些类型?
类中最高的类型是什么? 类中最低的类型是什么?
【问题讨论】:
标签: java class generics extends
如果您要完成泛型声明,那么您将拥有一个上界泛型类型。
public class Foo<T extends Integer> { }
这里,T 必然是任何是或从Integer扩展的东西。但是,由于Integer 是final 类...它只能容纳Integer。
因此,像这样的声明在编译时是合法且强制的:
Foo<Integer> foo = new Foo<>();
Foo bar = new Foo(); // This will produce raw type warnings!
...而像这样的声明在编译时是不合法的,因为它必须是或扩展Integer。
Foo<Long> baz = new Foo<>();
正式地,编译器会告诉你这个:
Error:(17, 56) java: cannot infer type arguments for Foo<>; reason: no instance(s) of type variable(s) T exist so that Foo<T> conforms to Foo<java.lang.Long>
如果您在Integer 的层次结构中更高,您将到达Number,这将允许您使用扩展Number 的任何类进行实例化:
public class Foo<T extends Number> { }
那么,Long 泛型类型将是合法的,您允许的类型将是这些:
NumberShortIntegerDoubleFloatByteBigDecimalBigInteger...仅举几例。
【讨论】:
它将接受任何指定类或其潜在子类。
如果我这样做了:
<? extends MyClass>
它将允许类型“MyClass”,并说另一个类是public class Another extends MyClass。但它不会接受其他类。
【讨论】:
你是说
public class Foo <T extends Integer>{.....}
?
T 将接受任何是Integer 的东西。
我不明白您在这里所说的“最高”和“最低”类型是什么。不过我相信上面的陈述应该足够清楚了。
例如你不能传入Number(它是Integer的父类)。你可以传入Integer。如果你有一个扩展 Integer 的 FooInteger,你也可以在这里使用它。
【讨论】: