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());
}
}