【问题标题】:Java return datatype when class is stored in an array当类存储在数组中时Java返回数据类型
【发布时间】:2020-03-05 12:32:17
【问题描述】:

这是我的示例类

public class Value<E> {
    public final E value;

    public Value(E value) {
        this.value = value;
    }
}

这会返回一个字符串而没有对象,所以我不需要强制转换它。

String a = new Value<String>("test").value;

但是,如果我想这样做,那么我需要投射它。

ArrayList<Value<?>> a = new ArrayList<>();
a.add(new Value<String>("test"));

String b = a.get(0).value; // Runtime error

如果我将值添加到ArrayList,它会返回一个Object,但我希望它返回我定义的元素。 我该如何解决这个问题?

【问题讨论】:

标签: java generics arraylist


【解决方案1】:

替换

ArrayList<Value<?>> a = new ArrayList<>();

ArrayList<Value<String>> a = new ArrayList<>();

【讨论】:

  • 重点是,我还希望该值是整数并将数据类型存储在对象Value
  • 编译器应该如何知道您添加的第一个值对象包含一个整数,第二个包含一个字符串?这是不可能的。
  • 好吧,我认为它能够返回正确的数据类型,因为public final E value; 我想如果不可能的话,我需要使用 instanceof 然后强制转换它。谢谢。
【解决方案2】:

你不能。您定义了您不知道(或关心)Value&lt;?&gt; 中包含哪些类型,因此您只能将它们视为Object,因为这是它们保证的一件事(它们也可以是子类,但他们仍将始终是Objects)。

如果您认为并希望可以将Strings 和Integers 存储在同一个List 中,那么除非将它们视为Objects,否则这是不可能的。此外,无论如何,您都不应该在同一个集合中存储不同的类型(通过继承层次结构除外)。

【讨论】:

    猜你喜欢
    • 2012-01-13
    • 2016-02-15
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 2017-08-19
    相关资源
    最近更新 更多