【问题标题】:ArrayList with multiple Generic types?具有多种泛型类型的 ArrayList?
【发布时间】:2013-12-18 11:35:36
【问题描述】:

我有这个我无法弄清楚的窃听问题。我有这个练习:

完成以下泛型 Pair 类,以便执行 程序给出指示的输出。不要更改主目录。

class Pair ... {   ...  }

 class GenericPairTest {        
 public static void main(String[] args) {       
    Pair<String,Integer> phoneNumber = new Pair<>("Bill's number", 1324);   
        System.out.println(phoneNumber);

           Pair<Double,Double> point = new Pair<>(3.14, 2.32);      
       System.out.println(point);   
     } 
 }

输出应该是这样的:

比尔的号码 1324

3.14 2.32`

我试过这样做:

import java.util.*;

class Pair <T,U> {

    ArrayList<T,U> newList = new ArrayList<>();

  Pair(T inT, U inU){
    newList.add(inT,inU);
  }

}

class GenericPairTest {

    public static void main(String[] args) {        
        Pair<String,Integer> phoneNumber = 
            new Pair<>("Bill's number", 1324);  
        System.out.println(phoneNumber);
        Pair<Double,Double> point = 
            new Pair<>(3.14, 2.32);
        System.out.println(point);
    }
}

但它不起作用:(

【问题讨论】:

  • 当你说“不起作用 :(” - 你是什么意思?编译错误?逻辑错误?这将帮助人们更好地帮助你。

标签: java generics arraylist


【解决方案1】:

为什么需要列表?你只需要存储两个对象:

class Pair <T,U> {
    private T _t;
    private U _u;

    public Pair(T t, U u) {
        _t = t;
        _u = u;

    public String toString() {
        return _t + " " + _u;
    }
}

【讨论】:

  • 那他为什么要在main中创建一个arraylist呢? :( 语法“class name = new class();”不是用来创建列表的吗?
  • 谁创建了arraylist?在哪里?
  • 我被这点搞糊涂了Pair&lt;String,Integer&gt; phoneNumber = new Pair&lt;&gt;("Bill's number", 1324);
  • 噢噢噢噢!它只是说明我们创建一个新的 Pair 类并作为 T 一个 String 和 U 一个 Integer 传入,将此实例称为“phoneNymber”并使用 new 创建一个引用,并将 Bill 的号码作为 String 和 1324 作为 Integer :D 是不是吗?
【解决方案2】:

您的Pair 类中不需要ArrayList

只需将这两个值保留为两个通用成员即可。

【讨论】:

    【解决方案3】:

    我认为你正在寻找这个:

    ArrayList<Pair<T,U>>
    

    但我认为您应该创建一个内部 Pair 类,它可能看起来像这样:

    public class Pair<T, U> {
        private T left;
        private U right;
        // getters/setters + constructor for them
    }
    

    您可以像其他人指出的那样使用Map,但您不需要ArrayList

    【讨论】:

      【解决方案4】:

      你不能用 ArrayList 来做到这一点,但由于你的对总是恰好持有两个对象,它真的不需要将它们存储在一个列表中。只需使用两个字段:

      class Pair<T,U> {
          final T t;
          final U u;
      
          Pair(T t, U u) {
              this.t = t;
              this.u = u;
          }
      
          @Override
          public String toString() {
              return t + " " + u;
          }
      }
      

      您使用 ArrayList 的方式非常暗示 Map。例如,你可以这样写:

      Map<T,U> map = new HashMap<>();
      Pair(T t, U u) {
          map.put(t, u);
      }
      

      但由于映射可以保存任意数量的键值对,因此它并不是真正用于存储单个键值对的正确结构。

      【讨论】:

        【解决方案5】:

        如果你的情况,记住 Pair 类中的对就足够了,并且没有内部的 ArrayList

        之后,在外部,您可以在列表中包含Pairs。

        final List<Pair<T,U>> pairList = new ArrayList<>();
        

        另外,很抱歉这么说,但您在这里缺少一些非常基本的 OOP 技能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-12-06
          • 1970-01-01
          • 2020-06-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多