Java中这些"通用"语法之间的区别

Bi *_*Act 5 java generics

考虑一下:

public abstract class AbstractHibernateDao< T extends Serializable > {
  private T clazz;
}
Run Code Online (Sandbox Code Playgroud)

还有这个:

public abstract class AbstractHibernateDao< T extends Serializable > {
    private Class< T > clazz;
}
Run Code Online (Sandbox Code Playgroud)

我能够编译两者 - 所以我肯定在这里做了一些基本的检查.

Psh*_*emo 11

  • 如果T clazz我们期望一个类的实例,
  • 如果Class< T > clazz我们期望一个实例Class描述T(class literal).

所以,T我们将使用Integer.在这种情况下:

  • 在第一个例子,clazz可以让我们存储1,2等等.
  • 但在第二个例子中,它会期待Integer.class.


raj*_*uGT 4

private T clazz;
Run Code Online (Sandbox Code Playgroud)

这里clazz可以保存任何类型,即可序列化类型,甚至是您的自定义类对象(如果它是可序列化类型)。

在本例中,名称表明它是一个类 ( clazz),但值需要是 Class 对象。


private Class< T > clazz;
Run Code Online (Sandbox Code Playgroud)

在这里,它是的类型ClassClass是泛型类型,因此这里 clazz 只能保存Type 为 Serialized 的Class 对象。