理解Java中泛型的语法

时间:2012-12-27 13:51:46

标签: java hierarchy class-hierarchy generics

我开始学习Java-generics。我对泛型语法及其含义有一些误解。如果我的问题看起来太微不足道,我请求理解。

  1. 你可以写:

    public class MyClass<SomeClass> {}
    
  2. 你可以写:

    public class MyClass<C extends SomeClass> {} 
    
  3. 你也可以写:

    public class MyClass<? extends SomeClass> {} 
    
  4. 这些案例之间的区别是什么

    1. 第一种情况对我来说非常清楚:你可以使用 SomeClass 的实例和他的子类的实例作为MyClass的类参数。
    2. 我认为在这种情况下你只能使用 MyClass子类的实例
    3. 同样:只使用MyClass子类的实例作为MyClass的类参数。
    4. 我猜对了吗?尤其是第二种和第三种情况的使用有何区别?

      提前感谢您的解释!

1 个答案:

答案 0 :(得分:1)

不同之处在于您无法在泛型类声明中使用?

public class MyClass<? extends SomeClass> {} // this isn't valid  

上述声明会导致编译错误。

From Documentation:

  

使用以下格式定义泛型类:

     

类名{/ * ... * /}类型参数部分,   由尖括号(&lt;&gt;)分隔,在类名后面。它指定   类型参数(也称为类型变量)T1,T2,...和Tn。

public class MyClass<C extends SomeClass> {} 

在此声明中C type-argument ,它可以是SomeClass类型或其任何SubClass类型。

示例:

Class SomeOtherClass extends SomeClass {
}

MyClass clazz = new MyClass<SomeOtherClass>();
MyClass clazz = new MyClass<SomeClass>();