【问题标题】:Collection based Generics and Reflection基于集合的泛型和反射
【发布时间】:2013-06-18 17:14:06
【问题描述】:

所以这是我的问题。我有两个类...SingularEntity 和一个 ListEntity。顾名思义,SingularEntity 代表一个实体,而 ListEntity 代表一个奇异实体的列表……这个列表显然比 SingularEntity 本身具有更多的共同属性。所以我有一个扩展 SingularEntity 类的 AuthorizationEntity

public class SingularEntity{
}

public class AuthorizationEntity extends SingularEntity{

}

现在我有一个 ListEntity 代表任何 SingularEntities 的列表

public class ListEntity{

  public List<? extends SingularEntity> data;

  public ListEntity(List<? extends SingularEntity> data){
        this.data = data;
  }
}

现在,我想始终使用反射来填充列表......而且我总是在 results.add 方法中遇到错误。说方法 List.add(CAP#1) 不适用。任何帮助都将不胜感激

public List<? extends SingularEntity> build() {
            List<? extends SingularEntity> results = new ArrayList<SingularEntity>();
            try {

                Constructor javaBeanClassConstructor =
                        (Constructor) DTOClass.getDeclaredConstructors()[0];
                Class<?>[] constructorParameterTypes =
                        javaBeanClassConstructor.getParameterTypes();


                for (Object[] columns : lstInput) {
                    Object[] constructorArgs = new Object[constructorParameterTypes.length];
                    for (int j = 0; j < columns.length; j++) {
                        Object columnValue = columns[j];
                        Class<?> parameterType = constructorParameterTypes[j];
                        // convert the column value to the correct type--if possible  
                        constructorArgs[j] = ConversionManager.getDefaultManager()
                                .convertObject(columnValue, parameterType);
                    }

                    *results.add(javaBeanClassConstructor.newInstance(constructorArgs));*
                }
            }catch(Exception ex){
            }
            return results;
        }

【问题讨论】:

  • javaBeanClassConstructor.newInstance(constructorArgs) 正在返回什么类型?

标签: java generics reflection


【解决方案1】:

你应该参数化你的 ListEntity 类

public class ListEntity<T extends SingularEntity>{

  public List<T> data;

  public ListEntity(List<T> data){
    this.data = data;
  }
}

【讨论】:

  • 谢谢大家......非常感谢......所以现在编译在类型安全之后很好......但是在调用方法 List authData = DTOBuilder.newBuilder() .DTOClassNameCalled(AuthorizationDTO.class).InputListCalled(lstObject).build();
【解决方案2】:

这里的问题是你已经定义了一个List&lt;? extends SingularEntity&gt;,所以你不能添加到这个List。为什么不?因为对于编译器来说,这个List 可以是扩展SingularEntity 的任何东西,比如说一个新的MultipleEntity 类。 Java 不允许您将任意SingularEntity 添加到SingularEntity 的任何可能子类的任何List。

要添加到List,只需使用List&lt;SingularEntity&gt;。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多