gpt4 book ai didi

java - 为什么在使用泛型类时不需要指定类型参数?

转载 作者:行者123 更新时间:2023-11-29 10:03:51 25 4
gpt4 key购买 nike

今天编译这段代码时我很惊讶:

class GenericClass<T> {
public void emptyMethod(T instance) {
// ..
}

public void print(T instance) {
System.out.println(instance);
}
}

public class Main {

public static void main(String[] args) {
GenericClass first = new GenericClass();
System.out.println("Wow");
first.emptyMethod(10);
first.print(16);
}

}

编译器发出警告(类型安全:方法 emptyMethod(Object) 属于原始类型 GenericList。对泛型类型 GenericList 的引用应该被参数化),但无论如何它不会导致编译器错误并且运行“正常” (至少提供的打印方法)。据我了解,编译器使用 object 作为类型参数,但我发现它违反直觉。为什么编译器会做这样的事情?为什么它不需要我指定类型参数?

最佳答案

基本上,您使用的是原始类。

回想一下在 Java 中首次引入泛型时:有大量代码已经使用了 ListArrayList 等。为了避免破坏所有这些代码,但仍然重用现有的类,引入了原始类型——它基本上是在使用泛型,就好像它不是泛型一样。

如您所见,您会收到警告 - 因此值得避免 - 但这是完全允许它的主要原因。

参见 section 4.8 JLS 的更多信息,其中包括:

Raw types are closely related to wildcards. Both are based on existential types. Raw types can be thought of as wildcards whose type rules are deliberately unsound, to accommodate interaction with legacy code. Historically, raw types preceded wildcards; they were first introduced in GJ, and described in the paper Making the future safe for the past: Adding Genericity to the Java Programming Language by Gilad Bracha, Martin Odersky, David Stoutamire, and Philip Wadler, in Proceedings of the ACM Conference on Object-Oriented Programming, Systems, Languages and Applications (OOPSLA 98), October 1998.

关于java - 为什么在使用泛型类时不需要指定类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14759855/

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