gpt4 book ai didi

java - 奇怪的泛型行为。早早被抹杀?

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

今天我遇到了 Java 泛型的一些奇怪行为。以下代码可以正常编译并按您预期的方式工作:

import java.util.*;

public class TestGeneric
{
public static void main(String[] args)
{
GenericClass<Integer> generic = new GenericClass<Integer>(7);
String stringFromList = generic.getStringList().get(0);
}

static class GenericClass<A>
{
private A objA;
private List<String> stringList;

GenericClass(A objA)
{
this.objA = objA;
stringList = new ArrayList<String>();
stringList.add("A string");
stringList.add("Another string");
}

A getObjA()
{
return objA;
}

List<String> getStringList()
{
return stringList;
}
}
}

但是如果您将泛型变量的类型更改为 GenericClass(注意没有类型参数),编译将失败并显示消息“不兼容的类型:java.lang.Object 无法转换为 java.lang.String”。

这个问题似乎发生在任何包含具有具体类型参数的通用对象的通用类中。一些谷歌搜索没有发现任何东西,JLS 没有提到这种情况?我做错了什么或者这是 javac 中的错误?

最佳答案

原始类型GenericClass被认为已被删除,包括类未声明的泛型类型。所以getStringList返回原始 List而不是参数化 List<String> .

我发现很难在 Java 规范中找到一件事来指出这一点,但这是正常行为。

这是另一个例子。

public class Test {
public static void main(String[] args) {
String s;

// this compiles
s = new Generic<Object>().get();
// so does this
s = new Generic<Object>().<String>get();

// this doesn't compile
s = new Generic().get();
// neither does this
s = new Generic().<String>get();
}
}

class Generic<A> {
<B> B get() { return null; }
}

两者都是 AB被删除,但B由方法声明。很好奇。

这种令人惊讶的细微差别就是为什么必须警告不要使用原始类型。

关于java - 奇怪的泛型行为。早早被抹杀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24254210/

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