gpt4 book ai didi

java - 通用类型删除警告

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

我有 Thinking in Java 一书中的这段代码,其中 Bruce 指出调用方法 set() 时的警告。代码如下:

    package testPackage;

class GenericBase<T> {
private T element;
public void set(T arg) { arg = element; }
public T get() { return element; }
}
class Derived1<T> extends GenericBase<T> {}
class Derived2 extends GenericBase {} // No warning
// class Derived3 extends GenericBase<?> {}
// Strange error:
// unexpected type found : ?
// required: class or interface without bounds
public class ErasureAndInheritance {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
Derived2 d2 = new Derived2();
Object obj = d2.get();
d2.set(obj); // Warning here!
}
}

如果我删除注释,我会收到以下警告:
类型安全:方法 set(Object) 属于原始类型 GenericBase。对泛型类型 GenericBase 的引用应该被参数化

我的问题是,为什么在 set() 方法上显示警告?有人可以解释一下这个警告是什么意思吗?
顺便说一句,我对 Java 泛型完全陌生,虽然我阅读了关于泛型的其他问题,但我对删除还是有些困惑。

最佳答案

来自 Java 文档 here

Generics were introduced to the Java language to provide tighter type checks at compile time and to support generic programming. To implement generics, the Java compiler applies type erasure to:

  • Replace all type parameters in generic types with their bounds or Object if the type parameters are unbounded. The produced bytecode, therefore, contains only ordinary classes, interfaces, and methods.
  • Insert type casts if necessary to preserve type safety.
  • Generate bridge methods to preserve polymorphism in extended generic types.
  • Type erasure ensures that no new classes are created for parameterized types; consequently, generics incur no runtime overhead.

简单:每个泛型都是一个 Object在编译过程之后,它只是为您添加转换,如果您做错了什么,它将生成编译器错误。

关于 unchecked注解,当编译器不能确定你在做什么是正确的时候使用它(事实上,你使用的原始类型与 GenericBase<Object> 相同)

set 以来您收到警告除类型 T 之外的方法但由于您使用的是原始类型,它不知道什么 T是,并生成此警告,让您知道您正在使用原始类型(坏东西)。

您可以使用注释来表示:“我知道它是原始类型,但我知道它是合法的并且我知道我在做什么”。

由于泛型的实现方式,混合原始类型和泛型类型是可能的,正如我上面所说,在编译器处理 T 之后变成 Object这意味着像 GenericBase 这样的原始对象和GenericBase<T>一样.

它不要求使用泛型进行任何转换的原因是因为它会为您添加转换(并且您可以确定代码将始终在运行时运行,而不必担心可能的 ClassCastException )。

关于java - 通用类型删除警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25529990/

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