我有一个泛型课,Foo<T>.在一个方法中Foo,我想得到类型为T的类实例,但我无法调用T.class.
使用它的首选方法是什么T.class?
是否可以在Java中创建泛型类型的实例?我正在考虑基于我所看到的答案是no(由于类型擦除),但如果有人能看到我缺少的东西,我会感兴趣:
class SomeContainer<E>
{
E createContents()
{
return what???
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:事实证明,超级类型标记可用于解决我的问题,但它需要大量基于反射的代码,如下面的一些答案所示.
我会把这个开放一段时间,看看是否有人提出了与Ian Robertson的Artima文章截然不同的任何东西.
此问题的已接受答案描述了如何T在Generic<T>类中创建实例.这涉及将Class<T>参数传递给Generic构造函数并newInstance从中调用方法.
Generic<Bar>然后创建一个新实例,并Bar.class传入参数.
如果新Generic类的泛型类型参数不是某个已知的类,Bar但它本身是泛型类型参数,您会怎么做?假设我有一些其他类Skeet<J>,我想Generic<J>从该类内部创建一个新实例.然后,如果我尝试传入,J.class我得到以下编译器错误:
cannot select from a type variable.
Run Code Online (Sandbox Code Playgroud)
有没有办法解决?
触发错误的代码的具体位是:
public class InputField<W extends Component & WidgetInterface>
extends InputFieldArray<W>
{
public InputField(String labelText)
{
super(new String[] {labelText}, W.class);
}
/* ... */
}
public class InputFieldArray<W extends Component & WidgetInterface>
extends JPanel
{
/* ... */
public InputFieldArray(String[] labelText, Class<W> clazz)
throws InstantiationException, IllegalAccessException
{ …Run Code Online (Sandbox Code Playgroud) 我想在java中创建一个Generics Type对象.请建议我如何实现同样的目标.
注意:这似乎是一个微不足道的泛型问题.但我敢打赌......事实并非如此.:)
假设我有类声明:
public class Abc<T> {
public T getInstanceOfT() {
// I want to create an instance of T and return the same.
}
}
Run Code Online (Sandbox Code Playgroud) 如果我有这样的抽象类:
public abstract class Item
{
private Integer value;
public Item()
{
value=new Integer(0);
}
public Item(Integer value)
{
this.value=new Integer();
}
}
Run Code Online (Sandbox Code Playgroud)
有些类派生自Item,如下所示:
public class Pencil extends Item
{
public Pencil()
{
super();
}
public Pencil(Integer value)
{
super(value);
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我不能使用泛型调用构造函数:
public class Box <T extends Item>
{
T item;
public Box()
{
item=new T(); // here I get the error
}
}
Run Code Online (Sandbox Code Playgroud)
我知道有可能有一个没有构造函数的类型,但这种情况是不可能的,因为Pencil有没有参数的构造函数,而Item是抽象的.但我从eclipse得到这个错误:
不能实现类型T
我不明白为什么,以及如何避免这种情况?
我正在使用泛型来写东西,令我惊讶的是我发现这不起作用:
class foo<T>{
T innerT = new T();
}
Run Code Online (Sandbox Code Playgroud)
所以我不能实例化泛型类型?有没有办法做到这一点?
我想这样做:
public class BaseTable<T extends TableEntry>
{
protected int mRows;
protected int mCols;
protected ArrayList<T> mEntries;
public BaseTable(int rows, int cols)
{
mRows = rows;
mCols = cols;
mEntries = new ArrayList<T>();
for (int i = 0; i < rows; i++)
{
mEntries.add(new T(cols)); //this obv. doesn't work
}
}
}
Run Code Online (Sandbox Code Playgroud)
实例化泛型很难实现,但更难以实现的是,T这里没有默认构造函数,它int在构造函数中需要一个参数.
如何才能做到这一点?
我也在这里问了一个跟进问题.如果你能回答这个问题,我将不胜感激.
这个问题是相关的,但只有在假定类具有默认构造函数时才有意义.
嗨!我是一个尝试Java的人.所以我将如何在java中执行以下操作.
在C#中
public T create_an_instance_of<T>(){
T instance = default (T);
// here's usually some factory to create the implementation
instance = some_factory.build<T>();
// or even..
instance = some_factory.build(typeOf(T) );
return instance;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个新的T类型的对象。
我试过了:
T h = new T();
T h = T.newInstance();
Run Code Online (Sandbox Code Playgroud)
那些不起作用。我也尝试过:
T h = (T)(new Object());
Run Code Online (Sandbox Code Playgroud)
可行,但随后h.getClass().getName()返回java.lang.Object
有什么方法可以在不知道类名称的情况下创建此类的默认对象?
编辑(从评论):
T是通用的。喜欢Class<T>。
是否可以像在下面的代码片段中一样在Java中实例化通用对象?我知道在C#中它是可能的.但是,我还没有在Java中看到类似的机制.
// Let T be a generic type.
T t = new T();
Run Code Online (Sandbox Code Playgroud) 我想使用Java中通用方法设置捕获的类信息来创建实例.但是我没有看到如何在没有实际实例的情况下引用该类.可能吗?
public class Fancy {
static public <TypeToFind> TypeToFind createInSomeCase() {
// any type of logic with TypeToFind "class" generic will do, I just want to reference it.
// the below code is invalid, I could also declare a variable, but can't always create an instance to get the class
if (TypeToFind.getClass().equals(Something.class)) {
return TypeToFind.getInstance();
}
}
}
Run Code Online (Sandbox Code Playgroud)
......以后我可以这样做:
TheResultIsTheParameter t = Fancy.createInSomeCase();
Run Code Online (Sandbox Code Playgroud)
... 代替
TheResultIsAParameter t = Fancy.createInSomeCase(TheResultIsAParameter.class);
Run Code Online (Sandbox Code Playgroud)
... 要么
TheResultIsAParameter t = Fancy.createInSomeCase(t);
Run Code Online (Sandbox Code Playgroud)
我这太复杂了吗?