我试图在Java中有条件地创建一个Generic实例,其中类型作为参数传递。像这样的东西:
private void doStuff(somethingThatDescribesWhatTShouldBeHere) {
ArrayList<thetypeTthatwaspassedin> = new ArrayList<thetypeTthatwaspassedin>
... rest of logic
}
如果没有ArrayList<T>
尖叫回到我身边,我无法弄清楚T参数应该是什么样子。
这个想法是,如果T
是一个字符串,那么实例化ArrayList<String>
..如果它是Foo,那么ArrayList<Foo>
将被实例化而不是内部。
请帮忙
答案 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>());
}
}