"扩展"的层次结构类

时间:2014-04-30 02:02:38

标签: java class generics extends

延伸的层次结构是什么?例如,数字,整数等等。

例如,

public class Foo<extends Integer>
{.....}

这会接受哪种类型?

班上最高的类型是什么? 班上最低的类型是什么?

3 个答案:

答案 0 :(得分:2)

如果您要完成通用声明,那么您将拥有上限通用类型

 public class Foo<T extends Integer> { }

此处,T必然是 Integer扩展的任何内容。但是,由于Integerfinal类,因此它只能保留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泛型类型将是合法的,您的允许类型将是:

  • Number
  • Short
  • Integer
  • Double
  • Float
  • Byte
  • BigDecimal
  • BigInteger

......仅举几例。

答案 1 :(得分:1)

它将接受任何指定的类或它的潜在子类。

所以如果我这样做了:

<? extends MyClass>

它允许类型&#34; MyClass&#34;,并说另一个类public class Another extends MyClass。但它不会接受其他课程。

答案 2 :(得分:1)

你的意思是

public class Foo <T extends Integer>{.....}

T将接受任何Integer

我不明白什么是&#34;最高&#34;和#34;最低&#34;你在这里打字。但是,我相信上述陈述应该足够明确。

e.g。您无法传入Number(这是Integer的父类)。您可以传递Integer。如果您的FooInteger扩展为Integer,则也可以在此处使用。