gpt4 book ai didi

java - Java 中具有通用返回类型的方法调用

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:04:26 25 4
gpt4 key购买 nike

在C++中可以在参数中指定函数的返回类型,例如:

C++

    float* myFloat = CollectionClass.ptr<float>();
int* myInt = CollectionClass.ptr<int>();

在 Java 中是否有一个等效的方法来指定返回类型而不添加额外的类参数?

Java

    //This doesn't work (due to type erasure) 
public <T> T getDate()
{
if (T instanceof Date)
return new Date();
if (T instanceof Calendar)
return new Calendar();
}

Date myDate = getDate<Date>();

最佳答案

用签名 public <T> T getDate() 声明一个方法是完全没问题的.

但是,实现返回您想要的内容的方法是不可能的。方法在运行时做什么不能仅取决于其类型参数,因为它不知道其类型参数。

要对此有一个直觉,要意识到任何用泛型编写的代码也可以在不使用泛型的情况下等效地编写,只需删除泛型参数并在适当的地方插入强制转换。这就是“类型删除”的意思。

因此,要查看您的方法在泛型中是否可行,只需问一下,如果没有泛型,您将如何实现:

public Object getDate() 
{
// what would you do here?
}

Date myDate = (Date)getDate();

如果没有泛型你做不到,你也不能用泛型做。

C++ 模板完全不同。对于模板化的函数和类,C++ 模板为与其一起使用的每个类型参数生成函数或类的“单独副本”。即编译器采用模板化代码并将其“复制并粘贴”到多个版本中,每个版本都是独立的。因此,代码的每个副本都特定于特定类型的参数,因此可以在运行时使用该类型。

这就是为什么 C++ 模板化代码需要以源形式提供以便您使用它的原因——没有“编译”模板这样的东西。但是,在 Java 中,可以使用已编译的泛型类。 Java 中的泛型类和方法不会对它们可以使用的类型做任何假设。

关于java - Java 中具有通用返回类型的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15118271/

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