gpt4 book ai didi

Java 方法和泛型

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

为什么将泛型声明为方法的一部分?例如,当创建一个使用泛型的方法时,泛型必须包含在方法修饰符之后:

public static <T, K> void delete(AbstractDao<T, K> dao)

方法的泛型部分不显示为方法声明的一部分。根据 java 文档,方法包含以下项目:

Modifiers—such as public, private, and others you will learn about later.

The return type—the data type of the value returned by the method, or void if the method does not return a value.

The method name—the rules for field names apply to method names as well, but the convention is a little different.

The parameter list in parenthesis—a comma-delimited list of input parameters, preceded by their data types, enclosed by parentheses, (). If there are no parameters, you must use empty parentheses.

引用:https://docs.oracle.com/javase/tutorial/java/javaOO/methods.html

最佳答案

这是因为您必须分别考虑泛型类型参数的声明使用

在没有第一个 <T,K> 的方法声明中,像这样:

public static void delete(AbstractDao<T, K> dao)

编译器不会知道 TK应该是方法类型参数(从方法调用推断)。它会期望 TK已经声明(例如导入),因为这些是泛型的用法,而不是声明。

这就是为什么你需要声明 <T, K>在编译器的修饰符之后,告诉它 TK是从方法调用中推断出的类型参数。

当您像这样声明一个泛型类时,问题不会发生:

public class MyClass<T> {
}

因为没有别的意思T可以在这里,那只能是一个类型参数声明


注意:您还可以区分声明和用法之间的区别,因为您可以在声明期间约束类型参数,但不能在其使用期间约束类型参数。这是有效的:

public static <T extends Pony, K> void delete(AbstractDao<T, K> dao)

虽然这不是:

public static <T, K> void delete(AbstractDao<T extends Pony, K> dao)

为什么编译器不更聪明?

您可以告诉我编译器可能很聪明,它可以看到类型未声明,并推断它应该是通用的。但如果是这样的话,那可真是一团糟。

在大多数情况下,您的方法不会是通用的。在大多数情况下,类似 List<Something> 的参数将用于 Something实际上已经定义了。想象一下,如果您只是忘记导入 Something类...

编译器会假设一个泛型类型参数,被对象删除,你不会理解为什么你不能使用你的类的方法等。需要一些时间才能意识到什么是错的,因为编译器会接受这样的声明。

关于Java 方法和泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31751946/

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