找到泛型类型的类引用

3
@Service
public abstract class MainService<E extends AbstractEntity, R extends MainRepository<E>> {

    @Autowired
    MainRepository<E> repository;

    public E find(long id) throws Exception {
        return this.repository.find(---, id);
    }
}

这里是否可以找到泛型类型E的类引用,以便将其作为第一个参数通过此方法传递,而不是使用--- ...?

我对实现的期望是创建一个通用调用,以避免在所有服务类中重复以下代码。

return this.repository.find(Entity.class,id);

将代码以文本形式发布,而不是图像。 - Basil Bourque
你说你想避免调用指定实体类的存储库,是吗?只要存储库实例没有与实体类型一起输入,这是不可避免的。在你的情况下,MainRepository似乎没有类型参数(我猜自动装配没有提供具有实际实体类型作为类型参数的MainRepository实例)。那么所有服务都必须指定实体类是不可避免的。然而,服务可以通过反射从类声明中获取实体类。 - Albert Waninge
@AlbertWaninge 我为每个页面单独创建了服务类。我的意图是不想编写不需要额外代码的方法,比如保存/更新实体以及使用主键获取对象。 - Sangeeth S Kumar
1个回答

0

是的,这里有一个实现的例子:

import java.lang.reflect.ParameterizedType;

public class Foo {
    public static abstract class Bar<E> {
        public E returnAnE() throws InstantiationException, IllegalAccessException {
            Class e = (Class)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
            return (E)e.newInstance();
        }
    }

    public static class Baz extends Bar<String> {

    }

    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        Baz baz = new Baz();
        String s = baz.returnAnE();
    }
}

这段代码将无法处理与我们所拥有的类结构不匹配的情况,因此您应该使用实例检查而不是强制转换,并检查数组访问。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接