将T作为参数传递给Java,有条件地创建Generic

时间:2014-03-01 19:49:08

标签: java generics arraylist

我试图在Java中有条件地创建一个Generic实例,其中类型作为参数传递。像这样的东西:

private void doStuff(somethingThatDescribesWhatTShouldBeHere) {

   ArrayList<thetypeTthatwaspassedin> = new ArrayList<thetypeTthatwaspassedin>
   ... rest of logic
}

如果没有ArrayList<T>尖叫回到我身边,我无法弄清楚T参数应该是什么样子。

这个想法是,如果T是一个字符串,那么实例化ArrayList<String> ..如果它是Foo,那么ArrayList<Foo>将被实例化而不是内部。

请帮忙

3 个答案:

答案 0 :(得分:2)

好吧,只需要doStuff通用:

// If you can, pass a parameter of type T :
private <T> void doStuff(T something) {

   ArrayList<T> = new ArrayList<T>();
   ... rest of logic
}
// so it can be called like that :  
YourType param = ...;
foo.doStuff(param);

// If you can't pass a parameter of type T, you'll have
// to explicitly tell the compiler which type to use :
foo.<YourType>doStuff();

如Stijn Geukens暗示的那样传递Class<T>也是一种避免丑陋的后一种语法的常用方法,如果你不需要传递一个实际的对象。

答案 1 :(得分:2)

你的方法需要是通用的; e.g:

class Ideone
{

    public <T> void test (Class<T> c) {
        List<T> t = new ArrayList<T>();
    }
}

答案 2 :(得分:0)

以下是两个通用示例,一个使用静态访问:

import java.util.*;

public class Utility
{
    /**
     * Returns an empty mutable non-concurrent list, likely
     * java.util.ArrayList.
     *
     * @param <T> requested type for container
     *
     * @return  mutable non-concurrent list
     **/
    public static <T> List<T> newMutableList()
    {
        return (new ArrayList<T>());
    }
}


public class Utility2<T>
{
    /**
     * Returns an empty mutable non-concurrent list, likely
     * java.util.ArrayList.
     *
     * @param <T> requested type for container
     *
     * @return  mutable non-concurrent list
     **/
    public List<T> newMutableList()
    {
        return (new ArrayList<T>());
    }
}