-1

在尝试实现自定义数据类时,我遇到了以下问题。我只是想向 ArrayList 添加项目,但 Java 似乎对我正在使用的类型有问题。我尝试了多种解决方案均无济于事。下面我包含了来自我的自定义数据类型的代码以及来自我的代码的简化版本,它们会引发相同的错误。我已经包含了我尝试过的两个解决方案以及每个抛出的错误/警告。

我对代码比较陌生,尤其是在 StackOverflow 上提出问题,所以如果我忘记了什么或者可以澄清,请告诉我。

自定义数据类型:

  1 /**
  2 This file defines a transition function data type
  3 */
  4 
  5 import java.util.ArrayList;
  6 
  7 public class transition<X,Y,Z> {
  8         private ArrayList<Integer> current;
  9         private char scan;
 10         private ArrayList<Integer> future;
 11 
 12         //constructors
 13         public transition(int x, char y, int z) {
 14                 this.current = new ArrayList<Integer>();
 15                 this.current.add(x);
 16                 this.scan = y;
 17                 this.future = new ArrayList<Integer>();
 18                 this.future.add(z);
 19         }
 20 
 21         public transition(ArrayList<Integer> x, char y, ArrayList<Integer> z) {
 22                 this.current = new ArrayList<Integer>();
 23                 this.current = x;
 24                 this.scan = y;
 25                 this.future = new ArrayList<Integer>();
 26                 this.future = z;
 27         }
 28 
 29         //methods
 30         public ArrayList<Integer> getCurrent() {
 31                 return this.current;
 32         }
 33 
 34         public char getScan() {
 35                 return this.scan;
 36         }
 37 
 38         public ArrayList<Integer> getFuture() {
 39                 return this.future;
 40         }
 41 }

简化代码:

 1 /**
  2 Class designed to test out a bug encountered in my code
  3 */
  4 
  5 import java.util.ArrayList;
  6 
  7 public class test {
  8 
  9         public static void main(String[] args) {
 10 
 11                 //creating ArrayList and adding one transition to it
 12                 ArrayList<transition> list = new ArrayList<transition>();
 13                 transition trans = new transition(1, 'a', 2);
 14                 list.add(trans);
 15 
 16                 //creating list to add to
 17                 ArrayList<Integer> ints = new ArrayList<Integer>();
 18 
 19                 //testing loops over ArrayList and calls to trans
 20                 for(transition t : list) {
 21 
 22                         if(t.getCurrent().contains(1) && t.getScan() == 'a') {
 23 
 24                                                                         //Option 1
 25                                 ints.addAll(t.getFuture());             //t.java:24 warning: [unchecked] unchecked conversion
 26                                                                         //found    : java.util.ArrayList
 27                                                                         //required : java.util.Collection<? extends java.lang.Integer>
 28 
 29                                                                         //Option 2
 30                                 for(Integer j : t.getFuture()) {        //      t.java:26: incompatible types
 31                                         ints.add(j);                    //      found    : java.lang.Object
 32                                 }                                       //      required : java.lang.Integer
 33                         }
 34                 }
 35         }
 36 }
4

1 回答 1

0

这是因为它transition是一个泛型类(它有 3 个类型参数<X, Y, Z>)。

由于tis a raw transition(与 a 相对transition<String, Integer, Date>),因此变量 中的所有泛型类型信息都将transition被完全忽略t。(是的,这确实是原始类型的工作方式)。

所以就好像getFuture只返回一个ArrayList,而不是一个ArrayList<Integer>

只要摆脱<X, Y, Z>(我看不出他们为什么在那里),它应该可以工作。

这个问题的一个简单演示是这样的:

public class Main<T> {

    public static void main(String[] args) {
        int a = new Main().getList().get(0);       // Doesn't compile
    }

    List<Integer> getList() { return Arrays.asList(1, 2, 3); }
}

这不会编译,但如果你 delete <T>,它会编译。

于 2015-11-10T03:39:45.297 回答