Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法从静态方法(不调用构造函数)获取泛型T类对象?_Java - Fatal编程技术网

Java 有没有办法从静态方法(不调用构造函数)获取泛型T类对象?

Java 有没有办法从静态方法(不调用构造函数)获取泛型T类对象?,java,Java,下面是代码的样子 abstract class A<T> { T panel; public A() { code here does something I don't want to be called, and I can't overload it) } abstract T createPanel(); } ... class B extends A<RealClass> { ... @Override

下面是代码的样子

abstract class A<T>
{
   T panel;
   public A()
   {
      code here does something I don't want to be called, and I can't overload it)
   }
   abstract T createPanel();
}
...
class B extends A<RealClass>
{
   ...
   @Override
   RealClass createPanel()
   { 
      return new RealClass();
   }
}
抽象类A
{
T面板;
公共A()
{
这里的代码做了一些我不想被调用的事情,我不能重载它)
}
抽象T createPanel();
}
...
B类扩展了A类
{
...
@凌驾
RealClass createPanel()
{ 
返回新的RealClass();
}
}
我想要的是能够从某个方法接收RealClass.class,只有
class cls=B.class并且不调用B的任何构造函数

这有可能吗

我想要的是能够从某个方法接收RealClass.class,只有类cls=B.class

您需要获取父级的泛型

Type type = cls.getGenericSuperClass();
if (type instanceof ParameterizedType) {
    ParameterizedType ptype = (ParameterizedType) type;
    Class genericType = (Class) ptype.getActualTypeArguments()[0];
}
此类型仅在信息包含在字节码中时可用。如果你有,这就行不通了

class B<T> extends A<T>
B类扩展了A类

由于
getActualTypeArguments()[0]
将返回一个
T
类型。

是的,这实际上是可以执行此操作的情况之一

(Class<?>) ((ParameterizedType) getClass().getGenericSuperclass())
     .getActualTypeArguments()[0]
(类)((ParameterizedType)getClass().getGenericSuperclass())
.getActualTypeArguments()[0]
我应该这样做。或者,如果您可以使用第三方库,Guava的
TypeToken
将使其类似于
(类)新的TypeToken(getClass()).getType()


之所以可以这样做,是因为
A
是硬编码的——它是一个具体的类型参数,与对象的泛型类型不同,类的泛型类型和超类型是通过类型擦除来保留的。

这里的
static
在哪里起作用?我在这里找到的所有方法都来自B()构造函数(所以他们需要B类实例,不同于静态方法)。我希望在类A中有一个静态方法,该方法将其子类对象作为参数,并返回子类T类对象(对于B,它是RealClass.class)。谢谢!!!成功了!ps plz fix cls.getGenericSuperClass->cls.getGenericSuperClass