java中所有类都是基于object,那为什么还要使用泛型,有什么好处?
时间: 2024-02-19 15:59:44 浏览: 20
Java中所有类确实都是基于Object,但是使用泛型有以下好处:
1. 类型安全:泛型可以让编译器在编译时检查类型,从而提高类型安全性。使用泛型可以避免在运行时出现类型转换异常。
2. 代码重用:使用泛型可以使代码更加通用和重用,因为泛型可以适用于多种类型。
3. 代码可读性和可维护性:使用泛型可以使代码更加可读和易于维护。泛型代码比非泛型代码更易于理解和修改,因为它们更加清晰和简洁。
4. 性能:使用泛型可以提高代码的性能,因为泛型代码可以避免在运行时进行类型转换和装箱操作。
5. API设计:使用泛型可以更好地设计和组织API,使API更加通用和灵活。
综上所述,使用泛型可以提高代码的类型安全性、可读性、可维护性、性能和API设计。
相关问题
java 用JPA实体类中属性增删查改的泛型写法
JPA中的实体类属性增删查改可以用泛型来实现。
1. 增加实体类属性
```java
public <T> void addEntity(T entity) {
entityManager.persist(entity);
}
```
2. 删除实体类属性
```java
public <T> void deleteEntity(T entity) {
entityManager.remove(entityManager.merge(entity));
}
```
3. 更新实体类属性
```java
public <T> void updateEntity(T entity) {
entityManager.merge(entity);
}
```
4. 查询实体类属性
```java
public <T> T findEntity(Class<T> entityClass, Object primaryKey) {
return entityManager.find(entityClass, primaryKey);
}
```
以上是基于泛型的实体类属性增删查改的写法,其中`entityManager`是`javax.persistence.EntityManager`类型的实例对象,需要在调用上述方法前进行初始化。
提供一个基于ElasticsearchRestTemplate查询的ES查询工具类 java
可以参考以下代码实现一个基于ElasticsearchRestTemplate的查询工具类:
```java
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.List;
@Component
public class ElasticsearchQueryUtils {
private final ElasticsearchRestTemplate elasticsearchRestTemplate;
@Autowired
public ElasticsearchQueryUtils(ElasticsearchRestTemplate elasticsearchRestTemplate) {
this.elasticsearchRestTemplate = elasticsearchRestTemplate;
}
public <T> List<T> query(QueryBuilder queryBuilder, Class<T> clazz) throws IOException {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(queryBuilder);
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withSourceFilter(searchSourceBuilder.fetchSource());
nativeSearchQueryBuilder.withQuery(queryBuilder);
SearchResultMapper searchResultMapper = elasticsearchRestTemplate.getResultsMapper();
SearchResponse searchResponse = elasticsearchRestTemplate.query(nativeSearchQueryBuilder.build(), response -> response, RequestOptions.DEFAULT);
return searchResultMapper.mapResults(searchResponse, clazz);
}
}
```
这个工具类提供了一个`query`方法,根据查询条件QueryBuilder执行查询,返回符合条件的对象列表。
其中,`query`方法使用了`SearchResultMapper`将查询结果映射为对象列表,因此需要在项目中定义一个`SearchResultMapper`的实现类。这个实现类需要实现`mapResults`方法,将ES的查询结果映射为指定类型的对象列表,例如:
```java
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.search.SearchHit;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Component
public class MySearchResultMapper implements SearchResultMapper {
@Override
public <T> List<T> mapResults(SearchResponse response, Class<T> clazz, SearchHitMapper mapper) {
List<T> list = new ArrayList<>();
for (SearchHit hit : response.getHits()) {
Map<String, Object> source = hit.getSourceAsMap();
T obj = mapper.mapToObject(source, clazz);
list.add(obj);
}
return list;
}
}
```
这个`MySearchResultMapper`类将ES的查询结果映射为指定类型的对象列表。这里使用了一个`SearchHitMapper`接口,用于将ES的查询结果转换为对象,例如:
```java
public interface SearchHitMapper {
/**
* 将ES的查询结果转换为对象
*
* @param source 查询结果
* @param clazz 对象类型
* @param <T> 对象泛型
* @return 对象
*/
<T> T mapToObject(Map<String, Object> source, Class<T> clazz);
}
```
这个接口的实现类可以根据具体的业务需求来实现。