Java 未知类型的数组

Java 未知类型的数组,java,arrays,generics,Java,Arrays,Generics,为什么表达式?[]是非法的?我不明白为什么它比t[]更可疑。我知道一般数组创建有问题,所以我知道为什么像new T[]和new?[3]这样的东西是不允许的,但我不知道?[]有什么问题。例如,如果能有一个像void method这样的方法签名就好了?[]啊。这有什么问题吗 另外,编写接受未知类型数组的方法的首选方法是什么?你应该使用 public void method(Object[] arr) public void method(Object[] arr) 优先于 public <

为什么表达式?[]是非法的?我不明白为什么它比t[]更可疑。我知道一般数组创建有问题,所以我知道为什么像new T[]和new?[3]这样的东西是不允许的,但我不知道?[]有什么问题。例如,如果能有一个像void method这样的方法签名就好了?[]啊。这有什么问题吗

另外,编写接受未知类型数组的方法的首选方法是什么?你应该使用

public void method(Object[] arr)
public void method(Object[] arr)
优先于

public <T> void method(T[] arr)
public <T> void method(T[] arr)

或者,如果类型参数只出现一次,您应该避免在方法签名中使用类型参数,这是一个例外吗?

您将类型参数和类型参数混为一谈

类型参数为。 类型参数为。 考虑以下泛型类型列表示例:

一个类型参数是一个形式参数,就像上面示例中方法add的形式参数element一样。它只是在运行时指定的值的占位符

现在让我们使用泛型类型:

class LinkedList<T> implements List<T> {
    private Node<T> head; // here, T is the type argument of E in Node<E>
    ...
}

class Node<E> {
    private E element; // here, E is a placeholder for the 'real' type
    ...
}
List<String> list = new LinkedList<String>();
List<?> list = new LinkedList<String>();
再说一遍?是类型参数,因此不能像使用类型参数一样使用它

是的,您应该使用

优先于

public <T> void method(T[] arr)
public <T> void method(T[] arr)
因为它们都接受相同的潜在参数集,第一个更简单,类型参数更少

为什么表达式?[]是非法的

在语法上,因为[]的左侧必须是实际类型。从语言学上讲,这是因为它是不必要的,所以可以使用Object[]

一般来说,当你想做这样的事情时?扩展X[],在您的脑海中,只需将其转换为X[]。同样地,当你想使用类似的东西时?将X扩展为独立类型,请考虑X


对于泛型类型参数?需要扩展X,因为泛型类型不协变即使a是B的子类型,列表也不是列表的子类型。但是,数组类型是协变的a[]是B的子类型[]如果a是B的子类型,那么是否有?扩展X[]是不必要的。

如果您多次使用T(如public T methodT[]arr,T foo),则使用非常有用。T是在类级别或函数级别声明的类型?是一个通配符,它实际上从未给定特定的值,因此它不是您可以使用的实际类型。我不明白这个问题是用于定义类型参数的通配符,而不是类型参数本身的替代品,因此您不能在通常使用类型参数的地方使用问号!它也不允许有无效的方法吗?帕拉姆。同样的原因:“?”不是类型。使用列表,您将传递一个类型,该类型是在运行时解析的类型。对于常规数组,您正在声明一个在编译时解析的类型。您不能声明通配符并期望它在编译时得到解决,因此您得到的错误是正确的。这是我想说的语言要点。我同意?[]是不必要的,但泛型是如此复杂,我认为让它更一致、更容易理解是值得的。例如,如果您使用返回T[]的实例方法foo创建了一个泛型类MyClass,常识表明,如果您在MyClass上调用foo,您应该得到?[]。事实上,IntelliJ实际上将返回类型列为?[]我不知道eclipse。无法在代码中编写?[]是一件令人困惑和奇怪的事情。此外,当您想使用?[]时,您总是可以使用Object[],但如何使用并不总是显而易见的。例如,如果您想去掉signature void fooSet中的type参数,则必须写入voidfooSet@pbabcdefp:那是另一个问题。例如,void fooSet set不能转换为void fooSet>set谢谢。我试过了,你是对的。fooSet@pbabcdefp:是,哈希集