相关疑难解决方法(0)

当子类覆盖它们时,为什么我通过反射获取基类方法?

我有超级班:

class MyClass<T> {
  public void setValue(T value){
    //insert code
  }

  public T getValue(){
    return null;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个具体的推导

class MyClassImp extends MyClass<String> {
  @Override
  public void setValue(String value){
    //insert code
  }

  @Override
  public String getValue(){
    return null;
  }
}
Run Code Online (Sandbox Code Playgroud)

反思MyClassImpl作为:

Class clazz = MyClassImpl.class;
Method[] methods = clazz.getDeclaredMethods();
Run Code Online (Sandbox Code Playgroud)

我得到两个超类实现java.lang.Object getValue(),void setValue(java.lang.Object)并且java.lang.String getValue(),void setValue(java.lang.String).

根据Class.getDeclaredMethods()vis-a-viz 的Java文档

返回一个Method对象数组,这些对象反映由此Class对象表示的类或接口声明的所有方法.这包括公共,受保护,默认(包)访问和私有方法,但不包括继承的方法.返回的数组中的元素没有排序,也没有任何特定的顺序.如果类或接口未声明任何方法,或者此Class对象表示基本类型,数组类或void,则此方法返回长度为0的数组.类初始化方法<clinit>不包含在返回的数组中.如果类声明具有相同参数类型的多个公共成员方法,则它们都包含在返回的数组中.

为什么我得到超类型实现?有什么我想念的吗?

我需要这个的原因是我反思性地调用setValue基类实现,我已经添加了一些特殊的注释注释,当然还有其他约束.

java generics reflection inheritance

10
推荐指数
1
解决办法
2498
查看次数

Java中的泛型和反射

这可能是一个非常基本的问题,但我对Java中的泛型非常陌生,而且我很难用C#中的事情来改变我的思维过程,所以请耐心等待.

我正在尝试用Java构建一个通用存储库.我创建了一个如下所示的IRepository接口:

public interface IRepository<T extends IEntity>
Run Code Online (Sandbox Code Playgroud)

还有一个看起来像这样的Repository类:

public class Repository<T extends IEntity> implements IRepository<T>
Run Code Online (Sandbox Code Playgroud)

现在,从我的Repository类的构造函数中,我希望能够"确定"T的确切类型.例如,如果我实例化了这样的存储库:

IRepository<MyClass> repo = new Repository<MyClass>();
Run Code Online (Sandbox Code Playgroud)

我想知道T实际上是MyClass.这在C#中是微不足道的,但显然泛型是Java中完全不同的野兽,我似乎无法找到任何可以帮助我做到这一点的东西.

java generics reflection

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

标签 统计

generics ×2

java ×2

reflection ×2

inheritance ×1