【问题标题】:How can I pass a Type to a generic Class in java?如何将类型传递给 java 中的泛型类?
【发布时间】:2014-02-28 13:16:23
【问题描述】:

大家都在这里!我想将一个类型传递给一个泛型类型,比如 Arraylist,我该怎么做?我做了一个简单的例子,让你知道我想要什么,当然这段代码是错误的。

public static void passObjType(Object obj) {

    Class clazz = obj.getClass();

    ArrayList<clazz> arr = new ArrayList<clazz>();

}

public static void main(String[] args) {

    HashSet<String> hs = new HashSet<String>();

    passObjType(hs);
}

我希望,如果我输入一个 HashSet 对象,函数 PassObjType() 将创建一个带有 HashSet 的 Arraylist,如果我输入一个 String 对象,那么它将创建一个带有 String 的 Arraylist。我怎样才能做到这一点?

【问题讨论】:

  • 你不能那样做。类型参数必须在编译时知道。你不能在运行时添加它。

标签: java generics reflection arraylist


【解决方案1】:

可以使用Java Generics来获取Object类型的参数,如下:

        public static<T> void passObjType(T e) {
             ArrayList<T> arr = new ArrayList<T>();
        }

        public static void main(String[] args) {
            HashSet<String> hs = new HashSet<String>();
            String hp = new String();
            passObjType(hs);
            passObjType(hp);
        }

【讨论】:

  • @NiksTyagi Nilks,非常感谢!这就是我要的!!! (我现在的声望太低了(只有 11 岁),所以我不能投票...... :( )
  • 呵呵呵呵呵,亲爱的@user3279996。你的问题得到了解决,这很好
  • 哦,有人为我的问题投票,我得到了更多的声誉!我终于可以投票了~~~~ :D
  • 未使用参数e。它应该被删除。
【解决方案2】:

你可以试试

public static <T> void passObjType(T obj) {
    ArrayList<T> arr = new ArrayList<T>();
    //...
}

public static void main(String[] args) {
    HashSet<String> hs = new HashSet<String>();
    passObjType(hs);
}

但我不确定这是否是您想要的,因为在运行时泛型类型是 erasedArrayList&lt;String&gt; 只是 ArrayList(可以存储任何对象)。

【讨论】:

  • 未使用参数obj。它应该被删除。
  • @newacct obj 不直接使用,但需要传递稍后用作泛型的类型。此外,我们不知道 OP 代码稍后会是什么样子,所以我决定保留此参数以防万一以后需要它。
  • "obj 不直接使用,但需要传递稍后用作泛型的类型。"没有。这不是必需的。类型参数由调用者决定。
  • 好的,可以显式设置 T 方法的类型,当它被称为 instance.&lt;SomeType&gt;passObjType() 时,在这种情况下,SomeType 将用于代替 T 而不是获取它来自obj(如果它会从方法参数中删除)但是这样OP必须在编写时决定它(所以在编译时),问题的关键似乎是如何在运行时获得这种类型:“ 如果我输入一个 HashSet 对象,函数 PassObjType() 将创建一个带有 HashSet 的 Arraylist,如果我输入一个 String 对象,那么它将创建一个带有 String 的 Arraylist".
  • 总是在编译时决定。泛型只是编译时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2011-08-06
  • 1970-01-01
  • 2011-02-20
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多