相关疑难解决方法(0)

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

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

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

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

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

java generics

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

Java泛型,获取泛型参数的Class <T>

我有一个抽象类:

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吗?

java generics

40
推荐指数
1
解决办法
9万
查看次数

获取参数化类参数的类型?

我有以下课程

public class MyClass<T> {
    public Class<T> getDomainClass() {
          GET THE CLASS OF T
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经google了这个问题,我找到的所有答案都告诉我使用getGenericSuperClass(),但这个方法的问题是我必须有第二个类扩展MyClass而我不想这样做.我需要的是获得具体类的参数化类型?

java generics reflection

7
推荐指数
1
解决办法
406
查看次数

Java反射:从实现类中获取通用接口的类型参数

我有这个界面:

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但我不知道哪个.

java reflection

6
推荐指数
1
解决办法
5203
查看次数

了解Java中的泛型类型

我有一个通用类,说:

MyClass<T>
Run Code Online (Sandbox Code Playgroud)

在这个类的方法中,我想测试T的类型,例如:

void MyMethod()
{

    if (T == String)
        ...
    if (T == int)
        ...
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点 ?

谢谢你的帮助

java generics

4
推荐指数
2
解决办法
8918
查看次数

找到具有泛型参数的构造函数

如何找到传递泛型参数的类的构造函数.例如这样一个类:

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)

有任何想法吗??

java reflection

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

使用 Java Reflections 获取通用类字段类型

我有以下类结构:

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)

java generics reflection

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

Spring Data - 从存储库获取实体名称/类型

我正在寻找一种从实现 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)

java spring spring-data

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

使用 queryDSL 通过属性名称获取动态属性谓词

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

spring querydsl spring-data spring-data-jpa

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

如何在没有反射的情况下确定java中泛型属性的类类型?

我有以下课程:

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)

java generics

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