将T作为参数传递给在Java中有条件地创建泛型
我试图在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
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>());
}
}