这里的问题是编译器无法在编译时确定数组myArray的信息。它被认为是通用的,因为(正如 eclipse 向您展示的那样)它在 {new GenericClass<T>.MyClass(), ...} 中转换。这是因为您将类 MyClass 放在泛型类中。
此代码也不起作用:
package my.stuff;
public class GenericClass<T> {
class MyClass {
static MyClass[] myArray = { new MyClass(), new MyClass() };;
}
public GenericClass(final T[] param) {
MyClass myObject = new MyClass();
}
}
但这段代码有效:
package my.stuff;
public class GenericClass<T> {
public GenericClass(final T[] param) {
MyClass myObject = new MyClass();
MyClass[] myArray = { new MyClass(), new MyClass() };
}
}
class MyClass {
}
因为您没有在 MyClass 中使用泛型,所以最好的办法可能是第二个。
如果您将其声明为静态,则编译器知道 MyClass 不是通用的并且它知道要做什么。
此外,在 java 中创建泛型数组的唯一方法是创建一个原始类型,然后将其转换为泛型(参见此处:“无法创建 .. 的泛型数组” - 如何创建 Map<String, Object> 的数组?)。因此,如果您在泛型中绝对需要 myClass,则应将其转入 MyClass<T>,然后使用技巧:创建一个原始类型并将其强制转换为 MyClass<T>:
package my.stuff;
public class GenericClass<T> {
class MyClass<T> {
}
@SuppressWarnings("unchecked")
public GenericClass(final T[] param) {
MyClass<T> myObject = new MyClass<T>();
MyClass<T>[] myArray = new MyClass[]{ new MyClass<T>(), new MyClass<T>() };
}
}
即使您不在 MyClass 类中使用 T。