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あることです。事実上、それは、未定義の型のリストがあり、そこに a を入れようとしていることを意味します。これは型安全な操作ではありません。次のように load メソッドを実行するとどうなるか想像してみてください。contentsPerson

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

Boxcar<?>あなたの場合、Javaコンパイラは、型が不明であるため、バインドされていないパラメータ化された型の参照でメソッドにアクセスすることを許可しません。

代わりに、ワイルドカードの境界を定義し、次のように使用する必要があります。

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 に答える