如何在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

我想获得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(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();
    }
}