如何在Java中获取泛型数组的值?
我想获得Java中泛型类成员(数组)的实际值。我在谷歌上搜索了几个小时,但没有找到明确的答案。老实说,我对Java和这种通用的东西还不熟悉如何在Java中获取泛型数组的值?,java,generics,Java,Generics,我想获得Java中泛型类成员(数组)的实际值。我在谷歌上搜索了几个小时,但没有找到明确的答案。老实说,我对Java和这种通用的东西还不熟悉 public class Box<T> { private T t; public Box(T t) { this.t = t; } public void getTheT() { // get the value of t at index 0 System.out.println(t
public class Box<T> {
private T t;
public Box(T t) { this.t = t; }
public void getTheT() {
// get the value of t at index 0
System.out.println(this.t[0]); // this doesn't work
}
}
public class App {
public static void main(String[] args) {
Integer[] Arr = {2,3,4};
Box<Integer[]> i = new Box<Integer[]>(Arr);
i.getTheT();
}
}
公共类框{
私人T;
公共框(T T){this.T=T;}
public void gethet(){
//获取索引0处的t值
System.out.println(this.t[0]);//这不起作用
}
}
公共类应用程序{
公共静态void main(字符串[]args){
整数[]Arr={2,3,4};
方框i=新方框(Arr);
i、 gethet();
}
}
我已经更新了我的问题。也许这次更清楚了。
如何获得
t
的原始值?它显然取决于对象类型。System.out.println调用的toString的默认实现将返回此类信息。这才是真正的价值所在。如果您想要另一种格式,您必须手动执行,可能需要将数组封装在一个对象中
class Custom {
private Integer[] arr;
//Constructor
@Override
public String toString(){
String line = "";
for (int i : arr) {
line += i + ",";
}
//take off last ","
return line;
}
}
这里的“值”取决于您如何定义它。如果要打印本例中
对象的“值”,可能需要覆盖toString
方法。由于无法重写数组的实现,因此必须检查它。有很多库可以为您实现这一点(例如在ApacheCommons中)。在您的情况下,可以使用Arrays.deepToString()
方法。您只需将t
强制转换为其原始类型Integer[]
,如下所示:
public class Box<T>{
private T t;
public Box(T arr){this.t = arr; } // you forget this semi-colon
public void getTheT(){
// get the value of t at index 0
if(t.getClass() == Integer[].class){
System.out.println("t[0]:"+((Integer[])t)[0]); // prints 2
}
else
System.out.println(t);
}
}
public class App{
public static void main(String[] args){
Integer[] Arr = {2,3,4};
Integer i1 = 3;
Box<Integer> i = new Box<Integer>(i1);
i.getTheT();
Box<Integer[]> ia = new Box<Integer[]>(Arr);
ia.getTheT();
}
}
公共类框{
私人T;
公共框(T arr){this.T=arr;}//您忘记了这个分号
public void gethet(){
//获取索引0处的t值
if(t.getClass()==Integer[].class){
System.out.println(“t[0]:”+((Integer[])t[0]);//打印2
}
其他的
系统输出打印ln(t);
}
}
公共类应用程序{
公共静态void main(字符串[]args){
整数[]Arr={2,3,4};
整数i1=3;
方框i=新方框(i1);
i、 gethet();
方框ia=新方框(Arr);
ia.gethet();
}
}
假设您的框始终包含数组,那么最简单的解决方案是将类型参数T
设置为元素类型而不是数组类型(例如,Integer
而不是Integer[]
),然后将私有变量设置为T[]
而不是T
。然后,Box
将始终能够轻松访问数组元素,并且还可以方便地在其上使用任何方法,例如toString
:
public class Box<T> {
private T[] t;
public Box(T[] t) { this.t = t; }
public void getTheT() {
System.out.println(t[0]); // access individual elements
System.out.println(java.util.Arrays.toString(t)); // print the lot
}
}
public class App {
public static void main(String[] args) {
Integer[] Arr = { 2, 3, 4 };
Box<Integer> i = new Box<>(Arr); // not Box<Integer[]> any more
i.getTheT();
}
}
不幸的是,目前在Java中没有一种好的、高性能的方法来编写可以处理所有数组元素的代码,而不管它们的类型如何。相反,正如您看到的java.util.array
的方法一样,这样的代码必须编写九次。对于元素类型<代码>对象<代码>(以及扩展<代码>对象<代码>的所有内容),以及基本元素类型(布尔
,字节
,短
,字符
,长
,浮点
,双
)各一次。它只是调用toString()您的实例的……对于GAPICS来说,这看起来很不幸,您必须始终考虑给定规范的最特定的类,在这种情况下,它只是代码>对象< /C> >,不是数组,因此只能调用<代码>对象.toStReg()/<代码> @ DRAGONDRAIKK,这不是java中继承的作用,重写的toString
将始终被调用。@user3707125是的,我不太清楚。但是,对于数组,toString()
仍然只是对象引用,这不是很重要helpful@all:是的,我知道每个对象都有toString方法。但是,我真正要做的是操纵t的值。假设我创建box的实例并将Integer[]作为参数传递。然后我想创建一个方法,可以在特定索引处更改t元素。如果我不能访问t的元素,我怎么做?如果我创建普通的Box类,这种情况会简单得多,但我的要求是它是一个泛型类,这很容易混淆。是的,你说得对。但是如何获取t的真实值呢?在本例中,t是一个整数[]对象。我不能像这样以标准方式执行此操作。I[0]因为它是泛型的。它给我的错误是“表达式的类型必须是数组类型,但它解析为T”。你所说的“实值”是什么意思?你如何定义它?我已经更新了我的问题亚当。老实说,我是Java中这种泛型类型的新手,也许我的问题不是很清楚。在我的应用程序类中,我创建了新的Box实例。Box是检索任何类型的泛型类。在我的应用程序类中,我在创建框时传递了整数[]Arr={2,3,4}。构造函数将数组复制到t(t是泛型类型)对我来说是有意义的。现在,出于某种原因,我想访问该值(2,3,4)。对于非泛型类中的非泛型类型,我可以通过调用t[0]来访问id为0的元素。但它不适用于这种通用类型。你太棒了:)。你的回答给了我一个很好的线索来解决我的问题。谢谢
public class Box<T> {
private T t;
public Box(T t) { this.t = t; }
public void getTheT() {
// print all array elements
for (int i = 0, len = java.lang.reflect.Array.getLength(t); i < len; i++) {
System.out.println(java.lang.reflect.Array.get(t, i));
}
}
}
public class App {
public static void main(String[] args) {
int[] Arr = { 2, 3, 4 };
Box<int[]> i = new Box<>(Arr); // primitive array element type!
i.getTheT();
}
}