将T作为参数传递给在Java中有条件地创建泛型

将T作为参数传递给在Java中有条件地创建泛型,java,generics,arraylist,Java,Generics,Arraylist,我试图在Java中有条件地创建一个泛型实例,其中类型作为参数传递。大概是这样的: private void doStuff(描述应该看到什么的东西){ ArrayList=新的ArrayList …逻辑的其余部分 } 如果没有ArrayList的尖叫声,我一辈子都想不出T参数应该是什么样子 如果T是一个字符串,那么就会实例化ArrayList。。如果是Foo,那么将在内部实例化ArrayList 请帮助好吧,只需将doStuffgeneric: // If you can, pass a p

我试图在Java中有条件地创建一个泛型实例,其中类型作为参数传递。大概是这样的:

private void doStuff(描述应该看到什么的东西){
ArrayList=新的ArrayList
…逻辑的其余部分
}
如果没有
ArrayList
的尖叫声,我一辈子都想不出T参数应该是什么样子

如果
T
是一个字符串,那么就会实例化
ArrayList
。。如果是Foo,那么将在内部实例化
ArrayList


请帮助

好吧,只需将doStuffgeneric:

// 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();
//如果可以,请传递类型为T的参数:
私人空位(T某物){
ArrayList=新的ArrayList();
…逻辑的其余部分
}
//所以可以这样称呼:
YourType参数=。。。;
foo.doStuff(参数);
//如果不能传递类型为t的参数,则
//要明确告诉编译器要使用哪种类型,请执行以下操作:
foo.doStuff();

如Stijn Geukens所暗示的那样传递
,如果您不需要传递实际对象,那么也是避免丑陋的后一种语法的常见方法。

您的方法需要是泛型的;e、 g:

class Ideone
{

    public <T> void test (Class<T> c) {
        List<T> t = new ArrayList<T>();
    }
}
类表意符
{
公共空隙试验(c级){
List t=new ArrayList();
}
}

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

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>());
    }
}
import java.util.*;
公用事业
{
/**
*返回一个空的可变非并发列表,可能是
*java.util.ArrayList。
*
*@param请求的容器类型
*
*@return可变非并发列表
**/
公共静态列表newMutableList()
{
return(newarraylist());
}
}
公共类实用程序2
{
/**
*返回一个空的可变非并发列表,可能是
*java.util.ArrayList。
*
*@param请求的容器类型
*
*@return可变非并发列表
**/
公共列表newMutableList()
{
return(newarraylist());
}
}

请注意,实例化
ArrayList
和实例化
ArrayList
之间没有区别。在继续之前,请理解这一点。是的..但我不知道参数应该是什么样子。如果它是类,那么编译器会尖叫。在本例中,如果我将String.class作为参数Param传入,则无法执行ArrayList。它只是不想编译。在我打电话给多斯塔夫之前我知道是什么类型的。。但不是在doStuff内部..这需要作为参数传入。实际用例与GSONRequest相关。但是,创建GSONRequest的工厂函数必须将T类型作为参数,然后返回GSONRequest GSONRequest等。如何使用
ArrayList
?在@Sotirios看来,它可能只是
ArrayList
,没有任何进一步的上下文。根据您所写的内容,该方法不接受任何与
T
相关的内容,并返回
void
,因此不必担心
T
是什么。这两个答案都很好。这就是我所需要的专家。我正在从Java过渡到.NET,这是一个学习过程;即使是“专家”,告诉我吧。尤其是在处理安卓系统时。一半的Java库根本不存在。请注意,
类c
是未使用的,可以删除。最后一个示例,
foo.doStuff()
,表明即使使用
T
也是徒劳的。对于一个毫无意义的问题,这是一个有效的答案。@Paul Bellora我同意,一个更完整的答案可以解释这种徒劳,但嘿,我不知道该在哪里停下来。。。如果你开始解释这一点,你必须解释类型擦除,然后解释为什么以及何时使用泛型仍然有效(因为,好吧,OP会想知道),你可能需要解释类型规范,也可能是通配符,以及。。。好吧,你明白了。尽管如此,请随意编辑我的答案,并加入您认为有用的内容。
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>());
    }
}