【问题标题】:Programmatically setting a list identifier以编程方式设置列表标识符
【发布时间】:2019-01-07 07:02:54
【问题描述】:

一个java类包含一个实例变量List。 我需要设置 ListString 变量中保存的对象类型。

private List<VARIABLE> myList; String VARIABLE = "BasicDegreeClass";

在JAVA中是否允许这样做,如果可以,如何实现?

提前致谢

【问题讨论】:

  • 不确定您的具体情况。这行得通吗? class Test&lt;T&gt;{ List&lt;T&gt; list; }.
  • 我想做这样的事情List&lt;VARIABLE&gt; myList = new ArrayList&lt;VARIABLE&gt;();
  • 是的,这就是我在上面所做的。使用泛型类型。
  • 不确定您的要求,但您最好使用Java generics。或者你可以使用String variableType = myList.get(index).class.getName() 之类的东西。但请确保您的列表已初始化(非空)且不为空,并注意您永远不应使用大写标识符名称声明包私有变量。

标签: java android list identifier


【解决方案1】:

首先,您必须创建一个列表,其中 T 是列表中包含的对象的类型。

所以,你的代码应该读作

private List&lt;T&gt; myList;

来自 javadoc,

&lt;T&gt; the type of elements in this list.

在您的情况下,编译器将不知道要添加到列表中的元素的类型,因此它不会工作。

但是您可以使用List&lt;Object&gt; 作为替代,但从长远来看,这通常是一种代码异味,并且很难维护

  • 它扼杀了泛型的想法。
  • 使您的代码容易出现 ClassCastException。
  • 在一个完美的世界里,即使你在添加元素时是安全的, 您将需要在任何地方压制警告并需要回退到 类型。

正确的解决方案:您可以编写一个接口,ArrayList 的所有对象都将遵守该接口。继续类似

List<'YOUR INTERFACE TYPE HERE'> myList = new ArrayList<>();

您不必担心列表中的对象类型。希望这会有所帮助!

如果您太具体而无法保存在 String 中,这里有一个解决方法。

public static <T> List<T> getCastedList(List<Object> objList, Class<T> clazz) {
        List<T> newList = new ArrayList<T>();
        if (objList != null) {
            for (Object object : objList) {
                if (object != null && clazz.isAssignableFrom(object.getClass())) {
                    newList.add((T) object);
                }
            }
        }
        return newList;
    }

并将其称为

getCastedList(myList, Class.forName(VARIABLE));

【讨论】:

  • 很高兴听到@NiazAhsan :)
【解决方案2】:

像这样使用泛型会更好

private List&lt;T&gt; myList;

documentation here

但可以使用字符串来表示类名或充当唯一标识符,前提是您自己支持这一点

【讨论】:

    【解决方案3】:

    您只能使用class 而不是primitive types 或其值创建List

    例子:-

    List<Integer> a =  new ArrayList<>();
    List<YourObject> obj = new ArrayList<>();
    

    但如果你尝试使用primitive types,那么你会得到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-26
      • 2016-12-11
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 2015-10-15
      • 1970-01-01
      相关资源
      最近更新 更多