如何解决类型T不能直接实例化试图使用泛型交换
我正在尝试使用泛型类型进行交换,但在最后第三行中遇到了以上错误 “新的T [output.size()]);” 有谁知道我该如何解决?
public class Exchange {
public static <T> T[] swap(T[] a,int i,int j){
int length = a.length;
ArrayList<T> output = new ArrayList<T>();
for (int b = 0; i<length;i++){
if (b==i){
output.add(a[j]);
}else if (b==j){
output.add(a[i]);
}else {
output.add(a[b]);
}
}
T[] outputs = output.toArray(new T[output.size()]);
return outputs;
}
}
解决方法
这是因为您想要的东西在一定程度上是不可能的(但在这种情况下,这是个好消息!您可以这样做)。
泛型是编译器的想象力。它不在类文件中,也不在运行时类型的一部分中。泛型(T
)用于“链接”事物。它告诉编译器:每当您调用此方法时,返回类型和第一个参数都是“链接的”-它们是同一对象。
用不同的方式表示,泛型未具体化:已知:
List<String> list = new ArrayList<String>();
getStringOut(list); // this method is not possible
之所以不可能,是因为list
是一个指向ArrayList
实例的变量,而该实例实际上并不知道它是一个字符串列表。完全是javac这样做,检查您是否从未向list
添加非字符串。列表本身并不在乎(它不知道您是否尝试向其中添加整数),类验证器也不在乎。只是javac
不允许您进入。
与已修正的数组相反:
String[] x = new String[10];
getStringOut(x); // this CAN be done!
这就是new T[]
完全不可能的原因。
但是,你说有个好消息
您在这里很幸运-您有一个数组(已类型化!),并且您希望输出数组具有完全相同的组件类型,因此您实际上可以这样做:
Class<?> componentType = a.getComponentType();
T[] outputs = (T[]) java.lang.reflect.Array.newInstance(componentType,output.size());
不幸的是,强制转换会导致javac发出警告,但是您一次可以忽略这种警告(通常不应该这样做)。 javac不确定newInstance
的输出是否确实保证是T的数组,但是,您可以用眼球来验证是否一定是这种情况,因此,您可以@SuppressWarnings
来解决这个问题。
但是您在这里很幸运-您有一系列的T,这是您可以做到这一点的唯一方法。那个或工厂函数,例如Supplier<T>
,否则不可能实现。
注意:您当然可以总是只交换“就地”,修改输入数组。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。