2
public abstract class BaseDaoImpl<E extends AbstractEntity> implements BaseDao<E> {

    .....

    public BaseDaoImpl() throws DataAccessException {
        logger = LoggerFactory.getLogger(E);  <<-- error here.
    }

在上面的代码中,我在调用getLogger(E).

E 无法解析为变量

这是有道理的,但getLogger(E.class)(或其变体)也不起作用。

我不想在构造函数中传递文字类,所以像将构造函数头更改为:这样的解决方案
public BaseDaoImpl(Class<E> clazz) ...不是一个选项。

我如何从中获取课程类型E

请注意以下问题的答案:没有参数时如何获取泛型类型的类?
不帮忙。

4

4 回答 4

6

E如果不更改构造函数,您将无法在运行时静态地了解您尚未了解的任何内容。那是因为在 Java 中,泛型参数根本没有任何运行时影响——编译器从字面上删除E了它生成的代码中的所有引用。因此,如果您希望代码能够告诉其类型参数被实例化的类,您必须自己添加某种参数(例如Class对象)。只是没有办法解决它。

于 2013-03-13T16:23:02.830 回答
2

正如@CorayThan 所指出的,可以通过反射来实现。一个简单的方法是从方法签名

interface BaseDao<E>
    E find(long id);

class FooDao implements BaseDao<Foo>
    Foo find(long id)

所以类型 E 可以通过

this.getClass().getDeclaredMethod("find", long.class).getReturnType();

但是,在构造函数中传递 a一个很好的选择。Class因为构造函数不打算由用户代码调用,所以这里的冗长不是问题。

abstract class BaseDaoImpl<E>

    BaseDaoImpl(Class<E> clazz)

class FooDao extends BaseBaoImpl<Foo>

    FooDao()
        super(Foo.class);

// usages:

BaseDao<Foo> fooDao = new FooDao(); // clean & simple API
于 2013-03-13T16:43:59.083 回答
0

因为泛型是在 Java 语言中使用类型擦除实现的,所以您不能做任何需要运行时类型信息的事情。有关更多信息,请参阅此页面

于 2013-03-13T16:34:07.567 回答
-1

已经回答了。

基本上,除非你使用反射,否则你不能。

我不建议使用反射,但如果你愿意,你应该能够使用:

GenericClass.class.getTypeParameters()
于 2013-03-13T16:34:21.400 回答