是否可以在Java中创建泛型类型的实例?我正在考虑基于我所看到的答案是no(由于类型擦除),但如果有人能看到我缺少的东西,我会感兴趣:
class SomeContainer<E>
{
E createContents()
{
return what???
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:事实证明,超级类型标记可用于解决我的问题,但它需要大量基于反射的代码,如下面的一些答案所示.
我会把这个开放一段时间,看看是否有人提出了与Ian Robertson的Artima文章截然不同的任何东西.
我有一个抽象类:
public abstract class RootProcessor<T> {
Class<T> clazz;
}
Run Code Online (Sandbox Code Playgroud)
我需要填写ClassT clazz;孩子RootProcessor- 每个孩子都有自己的孩子T
我发现只有一个解决方案,但它需要编译器参数 -Xlint:unchecked
public RootProcessor(){
this.clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
Run Code Online (Sandbox Code Playgroud)
这是最好的解决方案吗?没有我们可以这样做-Xlint:unchecked吗?
我有以下课程
public class MyClass<T> {
public Class<T> getDomainClass() {
GET THE CLASS OF T
}
}
Run Code Online (Sandbox Code Playgroud)
我已经google了这个问题,我找到的所有答案都告诉我使用getGenericSuperClass(),但这个方法的问题是我必须有第二个类扩展MyClass而我不想这样做.我需要的是获得具体类的参数化类型?
我有这个界面:
public interface EventHandler<T extends Event> {
void handle(T event);
}
Run Code Online (Sandbox Code Playgroud)
而这个类实现它:
public class MyEventHandler implements EventHandler<MyEvent> {
@Override
public void handle(MyEvent event) {
//do something
}
}
Run Code Online (Sandbox Code Playgroud)
鉴于:
Class myEventHandlerClass = getClazz();
Run Code Online (Sandbox Code Playgroud)
在这个条款中,T参数是MyEvent,这是一个具体的实现Event.如何使用反射获得这个?
我想要这样的东西:
Class myEventHandlerClass = getClazz();
Method handleMethod = myEventhandlerClass.getDeclaredMethod("handle");
Class<?>[] params = method.getParameterTypes();
Class<?> eventConcreteType = params[0];
Run Code Online (Sandbox Code Playgroud)
但myEventhandlerClass.getDeclaredMethod("handle");抛出NoSuchMethodException,因为我没有指定参数类型,因为我只知道这是一个具体的实现,Event但我不知道哪个.
我有一个通用类,说:
MyClass<T>
Run Code Online (Sandbox Code Playgroud)
在这个类的方法中,我想测试T的类型,例如:
void MyMethod()
{
if (T == String)
...
if (T == int)
...
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点 ?
谢谢你的帮助
如何找到传递泛型参数的类的构造函数.例如这样一个类:
class myClass<T> {
public myClass(T val1, Long val2 String val3){
...
}
}
Run Code Online (Sandbox Code Playgroud)
使用通常的反射方法getConstructor()缺少适当的参数:
Constructor<?> myConstructor = myClass.class.getConstructor( ??what here??, Long.class, String.class);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗??
我有以下类结构:
public class GenClass<T> {
public T elem;
}
Run Code Online (Sandbox Code Playgroud)
我按以下方式使用它:
public class Test {
public GenClass<UUID> data;
Run Code Online (Sandbox Code Playgroud)
现在我想使用 data( ) 的 Field 对象获取 elem 的类型,Test.class.getField("data")但是当我用来getType检索类时,通用信息被剥离。
如何将通用信息映射getGenericType到类对象以检索具有正确类型的字段?
编辑:由于存在一些误解,我尝试澄清我的问题。考虑这个例子:
public class AClass<T, Q> {
public Q elem;
// some other code using T...
}
public class BClass<T, Q> {
public T elem;
// some other code using Q...
}
Run Code Online (Sandbox Code Playgroud)
现在我想要一个函数来获取 elem 的类:
public class Test {
public AClass<UUID, String> a;
public BClass<Integer, Float> b;
void …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种从实现 Spring Data JPARepository接口的实例获取实体类型或类名的方法。
我有许多接口扩展了一个基本接口,该接口扩展了Repository接口并定义了一些基本查询。
@NoRepositoryBean
public interface EnumerationRepository<T extends IDatabaseEnumeration> extends Repository<T, String> {
// ...
}
public interface SampleEnumerationRepository extends EnumerationRepository<SampleEnumeration> {
}
Run Code Online (Sandbox Code Playgroud)
Spring 允许我将所有这些接口的实现作为集合注入到 bean 中
@Autowired
private Collection<EnumerationRepository<? extends IDatabaseEnumeration>> repositories;
Run Code Online (Sandbox Code Playgroud)
我想将所有这些实现放入Map一个通用方法中以便于访问。我想使用实体类型或名称作为键,但我不确定从哪里获取它。有没有办法获得这些属性之一?最好是班级类型。
我能够通过这样的查询实现所需的行为。但如果可能的话,我想避免使用这种解决方案,因为它会创建对底层数据库的依赖。
@Query(value = "select '#{#entityName}' from dual", nativeQuery = true)
public String getEntityName();
Run Code Online (Sandbox Code Playgroud) 我使用 Query DSL 生成的实体 EntitySerializer 以便使用 QueryDSL(与 SpringData 集成)查询 JPA 实体。
我收到来自客户端的属性名称,我想为可以添加 (AND) 到其他谓词的属性创建谓词。
我不知道如何从 EntitySerializer 获取与我的属性名称匹配的谓词/路径。例如,假设我们有一个 Person 实体(带有自动生成的 QPerson 类),它有一个我想过滤的“name”属性(最后我想创建一个泛型方法)。这是通用方法:
Public Predicat getPredicatByPropertyName(String propertyName) {
QPerson p = QPerson.person;
person.getPredicat(“propertyName”).like(“tom”);
}
Run Code Online (Sandbox Code Playgroud) 我有以下课程:
public final class Param<T>
{
private final String name;
private T value;
public Param(String name)
{
this.name = name;
}
public void setValue(T value) { this.value = value;}
public T getValue() { return value; }
}
Run Code Online (Sandbox Code Playgroud)
我会用以下方式实例化它:
Param<Long> foo = new Param<>("bar");
Param<String> baz = new Param<>("foo");
Run Code Online (Sandbox Code Playgroud)
我想向public boolean validate(String value)此类添加一个方法,该方法将执行以下操作:
public boolean validate(String value)
{
try
{
if (this.value instanceof String)
return true;
if (this.value instanceof Long)
this.value = (T) Long.valueOf(value);
else if (this.value instanceof Integer) …Run Code Online (Sandbox Code Playgroud)