0
public class Boxcar<S extends Things> {
public ArrayList<S> contents = new ArrayList<S>(); //an arraylist of things

public static void main(String [] args){
    Boxcar test = new Boxcar();
    test.addContents(new Person("239-235-2535", "Ronald", 36)); //works 100%
}

public Boxcar(Things type, int maxElements){
    this.type = type;
    boxcarId = boxcarIdCount;
    boxcarIdCount++;
    this.maxElements = maxElements;
}

public void addContents(S thing) {
    contents.add(thing);
  }
...

}//end boxcar class

public class Person implements Things {
int age;
String govtId, name;

public Person(String govtId, String name, int age){
    this.govtId = govtId;
    this.name = name;
    this.age = age;
}//end Consrtructor

public void load(ArrayList<Boxcar<?>> train){
    Person dude = new Person("239-235-235", "Ronald", 36);
    train.get(i).addContents(dude); // won't compile
}
...
}//end Person class

public interface Things {

public void load(ArrayList<Boxcar<?>> train, String [] params);

}//end interface Things

public class Train {
ArrayList<Boxcar<?>> train = new ArrayList<Boxcar<?>>(); 

    public void load(Things thing, String [] params){
    thing.load(train, params);
}
...
}

在上面的代码中,方法 addContents 在 Boxcar 类中执行时似乎工作正常。但是,当从 Person 类以完全相同的方式调用时,它的行为会有所不同。

这是什么原因,我该如何解决?

4

2 回答 2

1

它无法编译的原因是train参数是Boxcar未知类型的列表。实际上,这意味着您contents在其中包含未定义类型的列表,并且您试图将 aPerson放入其中,这不是类型安全的操作。想象一下,如果您按如下方式执行 load 方法会发生什么:

person.load(new ArrayList<Boxcar<Integer>>());

要修复它,您应该修复方法的签名,如下所示:

public void load(ArrayList<Boxcar<? super Things>> train){
...
}

此外,您应该避免将泛型与原始类型混合,就像您在 main 方法中所做的那样。代替:

Boxcar test = new Boxcar();

你应该使用:

Boxcar<Things> test = new Boxcar<Things>();

否则,即使代码编译(带有警告),它也可能在运行时因类转换异常而失败。

于 2012-12-05T05:54:55.450 回答
1

在您的情况下, Java 编译器不允许访问未绑定参数化类型的引用上的方法Boxcar<?>,因为该类型是未知的。

您应该改为定义通配符的边界并按如下方式使用它:

public void load(ArrayList<Boxcar<? super Things>> train)
{
    Person dude = new Person("239-235-235", "Ronald", 36);
    train.get(0).addContents(dude); 
}
于 2012-12-05T05:08:39.033 回答