8

オブジェクトが自分自身のコピーを作成できるようにするインターフェイスがあります。

public interface Duplicable<T extends Duplicable<T>> {
    public T duplicate();
}

私は今持っています

class X implements Duplicable<X>

しかし、X を拡張するクラス Y もあります。

別のジェネリック クラスが必要になるまでは、これは問題ではありません。

public class DoStuffWithDuplicable<T extends Duplicable<T>>

Y を使用して DoStuffWithDuplicable のジェネリック バージョンを使用することはできません。これは実装されていませんDuplicable<Y>Duplicable<X>、X から継承されているためです。

だから私は試しました

public class DoStuffWithDuplicable<T extends Duplicable<? super T>>

..しかし、これは後で安全でないキャストを導入することを意味します

(T) obj.duplicate()

コード本体で。また、クラス パラメータが複雑になり、クラスの使用法が理解しにくくなります。この問題を回避する方法はありますか?

4

2 に答える 2

1

It is not possible to do this in Java.

Assume you call obj.duplicate() on an object of type Y. Then the typesystem can only ensure that it will return an object of type X, since Y implements Duplicate<X>.

But you can just create a DoStuffWithDuplicable<X> and pass Y objects to it.

    DoStuffWithDuplicable<X> blub = new DoStuffWithDuplicable<X>();
    Y y = (Y) blub.doStuff(new Y());

For return values, the client of your library can just use safe casts, as he probably knows the concrete types.

An other option would be to use unsafe casts in the library and check the types manually:

class DoStuffWithDuplicable<T extends Duplicable<? super T>> {
    T doStuff(T obj) {
        @SuppressWarnings("unchecked")
        T t = (T) obj.duplicate();
        if (!t.getClass().equals(obj.getClass())) 
            throw new ClassCastException("...");
        return t;
    }
}
于 2013-08-25T12:36:06.260 に答える