gpt4 book ai didi

java - 泛型类方法调用

转载 作者:行者123 更新时间:2023-12-02 03:43:13 25 4
gpt4 key购买 nike

对于我缺乏泛型知识,我提前表示歉意...我试图了解泛型是如何工作的,我不确定它是什么,但我错过了一个让我困惑的关键部分,所以希望有人能澄清一下再多一点,让我克服这个困难。

BaseDtoUtil.mapToDto(map, OcrImageDocDto.class); //OcrImageDocDto extends DtoUtils

//This method is in class BaseDtoUtil
public static <T> List<T> mapToDto(Map<String, Object> map, Class<? extends DtoUtils> klass) throws SparkSQLException{
T obj = (T)klass.newInstance();
//return a list of these
}

所以我想我有两个问题:

  1. 首先是为什么当我传入 OcrImageDocDto.class 时它会提示当为方法调用定义的变量是任何类时? (我最初将其设置为 ( Class<?> )这不意味着任何类值吗?显然我错了,但不确定它意味着什么。
  2. 第二个问题是,如果我发送一个类值,我实际上能够获取该实例并返回一个类型值吗? <T> List<T> ?如果我没有记错的话,我相信通用变量 <T> List<T>用于对象的实例化。但如果是静态方法,他们会做什么?

我有点迷失,也许我理解泛型的方式是错误的......所以如果有人能澄清这两个问题,我认为这会有很大帮助!

最佳答案

问题1:

public static <T> List<T> mapToDto(
Map<String, Object> map,
Class<? extends DtoUtils> klass) throws SparkSQLException{
T obj = (T)klass.newInstance();
...

您不知道 klass.newInstance() 可以转换为 T - 您只知道它是 DtoUtils< 的实例 (或子类)。

因此,您可以更改为使用:

DtoUtils obj = klass.newInstance();

或约束T来扩展DtoUtils:

public static <T extends DtoUtils> List<T> mapToDto(
Map<String, Object> map,
Class<? extends T> klass) throws SparkSQLException{
T obj = klass.newInstance();
...

问题2:

是的,因为您有该类的实际实例。由于类型删除,如果没有它(或可以提供 T 实例的其他对象),您将无法创建实例。

这行不通:

public static <T extends DtoUtils> List<T> mapToDto(
Map<String, Object> map) throws SparkSQLException{
T obj = new T(); // Compiler error.

像下面这样的东西就可以了:

T obj = klass.newInstance();
List<T> list = new ArrayList<>();
list.add(obj);
return list;

关于java - 泛型类方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36604151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com