【问题标题】:Hierarchy of the "extends" class“扩展”类的层次结构
【发布时间】:2014-04-30 02:02:38
【问题描述】:

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

例如,

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

这会接受哪些类型?

类中最高的类型是什么? 类中最低的类型是什么?

【问题讨论】:

    标签: java class generics extends


    【解决方案1】:

    如果您要完成泛型声明,那么您将拥有一个上界泛型类型

     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

    ...仅举几例。

    【讨论】:

      【解决方案2】:

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

      如果我这样做了:

      <? extends MyClass>
      

      它将允许类型“MyClass”,并说另一个类是public class Another extends MyClass。但它不会接受其他类。

      【讨论】:

      【解决方案3】:

      你是说

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

      ?

      T 将接受任何是Integer 的东西。

      我不明白您在这里所说的“最高”和“最低”类型是什么。不过我相信上面的陈述应该足够清楚了。

      例如你不能传入Number(它是Integer的父类)。你可以传入Integer。如果你有一个扩展 IntegerFooInteger,你也可以在这里使用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-06
        • 2016-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多