开发者社区 问答 正文

Java类如何保存有关泛型类型的信息?

正如我理解正确,爪哇执行类型擦除,其中T在

class Test { private T something;

} 成为对象。但是为什么在这个例子中:

class Test { private Object[] arr; private int index = 0;

Test(){ arr = new Object[10];)

public void put(T el) { arr[index++] = el; }

}

Test test = new Test(); test.put(10) 触发编译错误并要求在编译时T成为String的参数Object?

谢谢你的回答!

展开
收起
被纵养的懒猫 2019-09-17 17:29:59 615 分享 版权
阿里云 AI 助理回答

在Java中,类型擦除确实会发生,这意味着在编译后泛型类型信息(如T)会被擦除,实际的类只使用它们的原始类型或边界类型。然而,你的问题描述中提到的现象实际上与类型擦除无关,而是关于泛型方法的实际使用和编译器对泛型类型的推断。

在这个例子中:

class Test<T> {
    private Object[] arr;
    private int index = 0;

    Test() {
        arr = new Object[10];
    }

    public void put(T el) {
        arr[index++] = el;
    }
}

Test<?> test = new Test(); // 这里需要指定类型参数,否则会报错
test.put(10); // 如果上面的声明是正确的,这里不会触发错误

首先,创建Test实例时,你需要明确指定泛型参数类型,除非你有特定的理由使用通配符(如Test<?>表示可以接受任何类型的Test)。如果你想要存储任何类型的对象,最直接的方式是在定义Test类时就指定Object作为泛型参数,或者在实例化时明确指定类型:

// 明确指定类型为Integer
Test<Integer> test = new Test<>();
test.put(10); // 这样就不会有问题了

或者,如果你想让Test能够接受任何类型的对象而不事先指定类型,你可以这样定义和实例化:

class Test {
    private Object[] arr;
    private int index = 0;

    Test() {
        arr = new Object[10];
    }

    public void put(Object el) {
        arr[index++] = el;
    }
}

Test test = new Test();
test.put(10); // 正确,因为put接受Object类型

在你的例子中,如果尝试不指定泛型类型就创建Test的实例,编译器无法确定T的具体类型,因此会报错。而当你调用put方法时,传递一个整数(如10),这实际上是允许的,只要你在创建Test实例时指定了合适的泛型类型,比如Test<Integer>

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: