2

次のように定義されたStudentクラスとクラスがあります。StudentPool

public class Student {
    public Student copy () {
        return new Student();
    } 
}

public class StudentPool<T extends Student> {
    public T copyStudent(T t) {
        return t.copy();
    }
}

したがって、copyStudentメソッドをコンパイルできず、安全でない型キャストを使用する必要があります。Javaがこれを違法と見なす理由がわかりませんか?

編集: user845279、lcfseth、および Bohemian: Student の次のリビジョンは、親クラスをその子クラスにキャストする同様のシナリオを引き起こす可能性があると思いますが、このバージョンはコンパイルに合格できます:

public class Student {
    public <T extends Student> T copy() {
       T rv = null; 
       return rv;
    } 
}

編集: 上記のコードを忘れてください:または安全にキャストされないrv可能性があります。null

4

3 に答える 3

4

SmartStudentを拡張したクラスがStudentあり、StudentPool<SmartStudent>. この場合copyStudent、 を取り、SmartStudentを返す必要がありますSmartStudentが、 の実装Studentはこれを行っていません。単純なStudentインスタンスを返すだけです。

編集:

必要なパターンを実装するために、Studentおよびそのすべてのサブクラスにコピー コンストラクターを指定できます。

public class Student {
    public Student(Student other) {
        //copy other's Student fields to this instance
    } 
}

public class SmartStudent extends Student {
    public SmartStudent(SmartStudent other) {
        super(other);
        //copy other's SmartStudent fields to this instance
    }
}

そしてStudentPool抽象化します:

public abstract class AbstractStudentPool<T extends Student> {
    public T copyStudent(T original);
}

AbstractStudentPool実装は、適切なコピー コンストラクターを呼び出します。

public class SmartStudentPool extends AbstractStudentPool<SmartStudent> {
    @Override
    public SmartStudent copyStudent(SmartStudent original) {
        return new SmartStudent(original);
    }
}
于 2012-05-11T01:27:49.847 に答える
2

問題は、からStudent返されますが、サブクラス返されることです...独自の型ではありません。Studentcopy()Student

問題を解決するためのアプローチは次のとおりです。

public static interface Copyable<T> {
    public T copy();
}

public static class Student implements Copyable<Student> {
    @Override
    public Student copy() {
        return new Student();
    }
}

public static class StudentPool<T extends Student> {
    public T copyStudent(Copyable<T> t) {
        return t.copy();
    }
}

補足として、ここではジェネリックは必要ないようです。

于 2012-05-11T01:35:19.447 に答える
0

親クラスをその子クラスにキャストすることはできません。暗黙のキャストは、逆にのみ機能します。明示的な型キャストを使用しても、実行時エラーが発生する可能性が高くなります。

于 2012-05-11T01:28:45.413 に答える