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

在 Java 中不可能做到这一点。

假设您在 Y 类型的对象上调用 obj.duplicate()。那么类型系统只能确保它将返回 X 类型的对象,因为 Y 实现了 Duplicate<X>。

但是您可以只创建一个 DoStuffWithDuplicable<X> 并将 Y 个对象传递给它。

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

对于返回值,您的库的客户端可以只使用安全强制转换,因为他可能知道具体类型。

另一种选择是在库中使用不安全的强制转换并手动检查类型:

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 回答
1

我可能没有正确理解你的问题,但我会试一试。

首先,为什么你有一个像这样扩展自己的接口?

您可以尝试的是:

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

然后,当您使用另一个希望泛型参数可复制的类时,您可以这样做:

public class X<T extends Duplicable<T>> {
    code...
}

现在,当您从 X 继承时,子类中的任何通用组件都必须是可复制的。

于 2013-08-23T12:49:55.417 回答