我想为我的Java项目创建一个自定义泛型类,这就是我得到了多少 - 我发现代码作为如何创建泛型数组的示例。
public class RegisterSet<T> {
private T[] register;
public <T> RegisterSet(int size) {
register = (T[])Array.newInstance(T, size);
}
}
现在,我收到错误Incompatible types - found: T[], required: T[]
,这对我来说完全没有意义 - 我该如何解决这个问题?
答案 0 :(得分:4)
这很有道理,因为你有两个不同的类型参数叫做T.然而,修复它是相当困难的,因为我看不出你希望你的代码完全编译。考虑一下这个位:
Array.newInstance(T, size);
T是类型参数的名称...您不能将其用作方法的参数。
请注意,由于类型擦除,如果您希望能够创建正确类型的数组,则需要指定相关的Class
实例。例如:
public class RegisterSet<T> {
private T[] register;
public RegisterSet(Class<T> clazz, int size) {
register = (T[])Array.newInstance(clazz, size);
}
}
...但我不确定你在这里尝试使用哪个Array
课程。
答案 1 :(得分:1)
您需要一个包含T的Class
对象的变量。填充此对象的最简单方法可能是静态工厂方法:
public class RegisterSet<T> {
public static <T>RegisterSet<T> create(Class<T> clazz, int size) {
return new RegisterSet<T>(clazz, size);
}
private T[] register;
@SuppressWarnings("unchecked")
private RegisterSet(Class<T> clazz, int size) {
if (clazz.isPrimitive()) throw new IllegalArgumentException("Cannot create a RegisterSet of primitives");
register = (T[])Array.newInstance(clazz, size);
}
}
静态方法允许你说
RegisterSet<String> x = RegisterSet.create(String.class, 42);
比
略短且重复性更小RegisterSet<String> x = new RegisterSet<String>(String.class, 42);
答案 2 :(得分:0)
有两个错误:
首先:类定义了一个类型T,第二个方法定义了它自己的类型T,但是两个T都没有相互关系。 - 所以你必须从方法声明中删除额外的Type T:
public RegisterSet(int size) {
而不是:
public <T> RegisterSet(int size) {
第二:方法Array.newInstance需要一个Class实例作为其第一个参数,但类型T不是类的实例。 - 您需要的是将类型为Class的新参数引入构造函数参数列表,并使用此参数进行数组创建。
至少所有人都应该看起来像:
import java.lang.reflect.Array;
public class RegisterSet<T> {
private T[] register;
public RegisterSet(int size, Class<T> clazz) {
@SuppressWarnings("unchecked")
T[] register = (T[]) Array.newInstance(clazz, size);
}
}
...
new RegisterSet<Integer>(5, Integer.class)