相关疑难解决方法(0)

如何获取泛型类型T的类实例

我有一个泛型课,Foo<T>.在一个方法中Foo,我想得到类型为T的类实例,但我无法调用T.class.

使用它的首选方法是什么T.class

java generics

659
推荐指数
12
解决办法
64万
查看次数

在Java中创建泛型类型的实例?

是否可以在Java中创建泛型类型的实例?我正在考虑基于我所看到的答案是no(由于类型擦除),但如果有人能看到我缺少的东西,我会感兴趣:

class SomeContainer<E>
{
    E createContents()
    {
        return what???
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:事实证明,超级类型标记可用于解决我的问题,但它需要大量基于反射的代码,如下面的一些答案所示.

我会把这个开放一段时间,看看是否有人提出了与Ian Robertson的Artima文章截然不同的任何东西.

java generics

554
推荐指数
16
解决办法
43万
查看次数

如何从泛型类型参数中获取`.class`属性?

此问题的已接受答案描述了如何TGeneric<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

64
推荐指数
3
解决办法
2万
查看次数

在java中实例化泛型类型

重复:Java泛型为什么这不起作用

重复:在Java中实例化泛型类

我想在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)

java generics

57
推荐指数
5
解决办法
7万
查看次数

调用泛型类型的构造函数

如果我有这样的抽象类:

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
我不明白为什么,以及如何避免这种情况?

java generics

15
推荐指数
2
解决办法
2万
查看次数

Java泛型为什么我不能实例化泛型类型

我正在使用泛型来写东西,令我惊讶的是我发现这不起作用:

class foo<T>{

 T innerT = new T();

}
Run Code Online (Sandbox Code Playgroud)

所以我不能实例化泛型类型?有没有办法做到这一点?

java generics type-erasure

5
推荐指数
3
解决办法
2436
查看次数

Java:实例化没有默认构造函数的泛型类

我想这样做:

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 generics instantiation default-constructor

4
推荐指数
1
解决办法
7854
查看次数

Java泛型 - 获取类型

重复:在java中实例化泛型类型

嗨!我是一个尝试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)

java generics

3
推荐指数
1
解决办法
285
查看次数

如何制作一个新的T类型的对象

我正在尝试制作一个新的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 generics

3
推荐指数
1
解决办法
2182
查看次数

在Java中实例化通用对象

是否可以像在下面的代码片段中一样在Java中实例化通用对象?我知道在C#中它是可能的.但是,我还没有在Java中看到类似的机制.

// Let T be a generic type.
T t = new T();
Run Code Online (Sandbox Code Playgroud)

java generics

2
推荐指数
1
解决办法
2924
查看次数

使用类的方法结果中的泛型类

我想使用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)

我这太复杂了吗?

java generics

2
推荐指数
1
解决办法
91
查看次数