Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.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:获取泛型供应商返回对象的类类型_Java_Generics_Reflection_Supplier - Fatal编程技术网

Java:获取泛型供应商返回对象的类类型

Java:获取泛型供应商返回对象的类类型,java,generics,reflection,supplier,Java,Generics,Reflection,Supplier,假设给出了以下定义: final Supplier<MyClass> supplier = MyClass::new; 但在执行中间步骤之前使用此选项可能会导致不必要的对象创建您可以执行以下操作。有必要添加番石榴作为依赖项 import java.lang.reflect.Type; import java.util.function.Supplier; import com.google.common.reflect.TypeToken; public abstract cl

假设给出了以下定义:

final Supplier<MyClass> supplier = MyClass::new;

但在执行中间步骤之前使用此选项可能会导致不必要的对象创建

您可以执行以下操作。有必要添加番石榴作为依赖项

import java.lang.reflect.Type;
import java.util.function.Supplier;

import com.google.common.reflect.TypeToken;

public abstract class MySupplier<T> implements Supplier<T> {

  private final TypeToken<T> typeToken = new TypeToken<T>(getClass()) { };
  private final Type type = typeToken.getType();

  public Type getType() {
    return type;
  }
}

public class Test {

  public static void main(String[] args) {

    Supplier<String> supplier = new MySupplier<String>() {
      @Override
      public String get() {
        return new String();
      }
    };
    System.out.println(((MySupplier) supplier).getType());
  }
}
import java.lang.reflect.Type;
导入java.util.function.Supplier;
导入com.google.common.reflect.TypeToken;
公共抽象类MySupplier实现了Supplier{
private final-TypeToken-TypeToken=new-TypeToken(getClass()){};
private final Type=typeToken.getType();
公共类型getType(){
返回类型;
}
}
公开课考试{
公共静态void main(字符串[]args){
供应商=新的MySupplier(){
@凌驾
公共字符串get(){
返回新字符串();
}
};
System.out.println(((MySupplier)supplier.getType());
}
}

类型擦除。。。您无法从
supplier
访问
MyClass
。也许在您的代码上共享更多上下文(完整方法等)可以导致其他方法……如果您想获得
,那么为什么您的供应商不被定义为
供应商
?这样如何@DiegoMarin我看过这篇文章,但这需要我进行重构,这是我努力避免的@Thomas因为供应商实际上是以这种形式使用的,我只是想我也可以使用供应商来获取信息,而不是重构一大堆代码@我们有一个基类
a
和几个子类
A1
A2
A3
。除此之外,我们还有一个高级的
enum
,它将某些条目映射到这些类。e、 g.
ENUM1(“我的第一个enum”,A1::new)
ENUM2(“更多的东西,A2::new)
。在我目前所在的代码中,我只有一个
A
(可以是
A1
A2
,…)的实例。我只能从这个
A
-对象中获得一个
enum
来表示实际的子类。我的目标是通过调用
A2
构造函数并将
A
作为委托传递以重新创建特定对象,从该
A
对象创建子类的对象(例如
A2
)。所有这些都是为了一些我正试图绕过的带有hibernate代理对象的edgecase。谢谢你把它们放在一起,但这似乎是一种过分的做法。我宁愿扩展我的
enum
s来携带必要的信息。我想总体的要点是,这是不可能的。
import java.lang.reflect.Type;
import java.util.function.Supplier;

import com.google.common.reflect.TypeToken;

public abstract class MySupplier<T> implements Supplier<T> {

  private final TypeToken<T> typeToken = new TypeToken<T>(getClass()) { };
  private final Type type = typeToken.getType();

  public Type getType() {
    return type;
  }
}

public class Test {

  public static void main(String[] args) {

    Supplier<String> supplier = new MySupplier<String>() {
      @Override
      public String get() {
        return new String();
      }
    };
    System.out.println(((MySupplier) supplier).getType());
  }
}