问题的关键:clazz其实应该是T.class,clazz该如何获取???
public abstract class BaseDaoImpl<T> implements BaseDao<T>{
private SessionFactory sessionFactory ;
//比如Class<User> clazz ,那么clazz就应该代表User.class
private Class<T> clazz ; //clazz表示该类的子类传递给父类泛型上的类型,即T.class ,我需要在父类上获取父类泛型的具体类型,通过反射
protected BaseDaoImpl(){
//由于BaseDaoImpls是抽象类,不能实例化,所以this表示子类的实例,那么我就可以利用this来获取父类(BaseDaoImpl)上的泛型的具体类型
//getGenericSuperclass()方法:获取父类的泛型,返回值是Type类型,Type是Class类的接口,ParameterizedType类用于描述泛型的类,它是jdk升级后新添加的类,专门用来描述泛型
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
//getActualTypeArguments()方法:获取泛型的真实类型,返回值是Type[]
clazz = (Class<T>) pt.getActualTypeArguments()[0] ;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Session getSession(){
return sessionFactory.getCurrentSession() ;
}
public void save(T entity){
this.getSession().save(entity) ;
} ;
public void update(T entity){
this.getSession().update(entity) ;
} ;
public void delete(Long id){
Object obj = this.getSession().get(clazz, id) ;
this.getSession().delete(obj) ;
} ;
public T getById(Long id){
return (T) this.getSession().get(clazz, id) ; //因为Seesion的get方法需要clazz是个Class类型,而且还必须是T.class,所以我要在上面极力获取到T.class
} ;
}
相关推荐
接下来,让我们探讨如何获取父类的泛型信息。在Java中,泛型是一种在编译时类型安全的机制,用于处理多种数据类型。然而,由于类型擦除,运行时无法直接获取泛型类型参数。但是,我们可以通过检查方法或字段的签名来...
使用继承方式获取泛型的类型实例是指在子类中获取父类的泛型类型实例,例如,我们可以定义一个抽象类 `JdbcDaoSupport<T>`,然后在子类 `UserDao` 中继承这个抽象类,并获取泛型类型实例。 ```java public abstract...
首先,我们使用`getClass()`方法获取当前类的Class对象,然后使用`getGenericSuperclass()`方法获取当前类的父类的Type对象。最后,我们使用`getActualTypeArguments()`方法获取Type对象中的实际类型参数,然后将其...
该类提供了一系列用于处理泛型的方法,包括获取父类泛型类型、获取方法返回类型的泛型等。 ```java public class GenericsUtils { // ... } ``` ##### 2. 获取父类泛型类型 ```java public static Class<?> ...
- **实例化泛型**:创建带有具体类型的对象,如`List<String> stringList = new ArrayList();`。 4. **泛型的边界** 在Java中,可以指定泛型类型的边界,例如`List<? extends Number> numberList`表示numberList...
使用时,我们可以指定`T`的具体类型,如`ArrayList<String>`或`ArrayList<Integer>`。 - **泛型方法**:在方法签名中使用类型参数,例如`public <T> T max(List<T> list)`,这个方法可以找出列表中的最大值,而不论...
例如,我们可以使用 `Class<T>.getGenericSuperclass()` 或 `Class<T>.getGenericInterfaces()` 来获取类的父类或接口的泛型信息。这些方法返回的是 `Type` 接口的实现,如 `ParameterizedType`,`WildcardType` 等...
- 当子类也是泛型类时,子类和父类的泛型类型必须保持一致: ```java class ChildGeneric<T> extends Generic<T> {} ``` - 当子类不是泛型类时,父类必须明确泛型的数据类型: ```java class ChildGeneric ...
Java泛型在编译后会进行类型擦除,这意味着运行时无法获取到泛型的具体类型信息。所有的泛型类型在运行时都会被替换为其边界或Object。这解释了为什么我们不能在运行时通过反射检查一个对象是否属于某个泛型类型。 ...
泛型也可以用于类的继承,子类可以继承父类的泛型类型,或者重新定义自己的类型参数。 最后,我们讨论一下泛型与多态的关系。泛型提供了一种新的多态形式,即类型参数多态。它允许我们在一个方法或类中处理多种类型...
- **泛型类**:泛型类是在类定义时引入类型参数的,如`Box<T>`中的`T`,它代表一个未指定的具体类型。这种设计使得类能够处理不同类型的对象,而不必为每种类型创建单独的类。例如,`Box<Integer>`、`Box<Double>`...
}`,`T`代表任意类型,实例化时可以指定具体类型,如`Box<String> box = new Box();` 3. **泛型方法(Generic Method)** - 泛型方法可以在类的任何地方定义,与类的泛型参数无关,如`public <T> void printList...
在没有泛型的情况下,我们需要在获取集合元素时进行强制类型转换,这可能导致`ClassCastException`。泛型自动确保类型安全,避免了这种风险。 - 例如,`List<String> list = new ArrayList();`当我们从`list`中取出...
因此,泛型主要用于编译时的类型检查,无法在运行时获取泛型信息。 7. 容器类与泛型 Java集合框架中的许多类都使用了泛型,如`ArrayList<T>`、`HashMap, V>`等。泛型使得我们可以指定容器存储的数据类型,从而避免...
在处理泛型时,由于Java的类型擦除,直接使用常规方式无法获取到泛型参数的具体类型。这时,就需要借助反射来获取泛型信息。 `ReflectionUtil`是一个工具类,它扩展了Java标准库中的`java.lang.reflect`,提供了...
- **类型擦除限制**:由于类型擦除,泛型无法在运行时获取具体类型信息,因此不能用于反射或序列化。 6. **最佳实践** - 尽量避免使用无界通配符`?`,因为它限制了方法的可用性。 - 在可能的情况下,使用协变(`...
` 来表示未知类型,这样我们可以在不知道具体类型的情况下操作数据结构。例如: ```java List<?> list; ``` 这表示 `list` 可以接受任何类型的 `List`。但是,由于我们不知道具体的类型,所以不能向这个列表添加...
当我们实例化泛型类时,需要提供具体的类型,如 `List<Integer>`,这样就确保了列表中的元素只能是整数类型。 泛型与子类继承息息相关,泛型类的子类也可以指定自己的类型参数,但必须遵循父类的约束。例如,如果 `...
泛型的核心在于类型参数(Type Parameter),这是一种用于创建泛型类或接口的占位符类型,允许在运行时确定具体类型。例如,`List<T>`中的`T`就是一个类型参数,表示“任何类型”。当创建一个`List`实例时,可以将`T...