1

我有以下代码:

public class Foo {

    interface Coo<T> {
        public T cool();
    }

    abstract class Bar<T extends Bar<T>> implements Coo<T>  {

        @SuppressWarnings("unchecked")
        T doSomething() {
            return (T) this;
        }

        @SuppressWarnings("unchecked")
        @Override
        public T cool() {
            return (T) this;
        }

    }

    class FooBar extends Bar<FooBar> {
        @Override
        public FooBar cool() {
            return super.cool();
        }

    }
}

为什么强制转换为(this)对象类型不安全?当 Bar 实现 Coo 时,返回的cool 必须是 T 类型,这不是泛型的说法,它扩展了 Bar 或其子类吗?

4

2 回答 2

3

因为thisinBar有类型Bar<T extends Bar<T>>但没有T,编译器会为Bar#doSomething. 以下不会产生任何警告:

abstract class Bar<T extends Bar<T>> {

    Bar<T> doSomething() {
        return this;
    }

}

的主体Bar#cool期望this是其子类型,T但事实并非如此。在Bar#cool中,this有类型Bar<T extends Bar<T>>并且是Coo<T>但不是的子类型T

于 2012-12-11T01:02:42.717 回答
1

T扩展Bar<T>,但Bar<T>(的类型this)不扩展T

想象

class A extends Bar<A> { ... }
class B extends Bar<A> { ... }

然后该方法被继承为:

class B {
    A doSomething() {
        return (A) this;
    }
}

这显然是不对的。

用泛型做你想做的事是不可能的。这是人们之间的一个很大的误解。他们认为递归边界将允许您进行自我类型。但是递归边界在 Java 中几乎没有用处。99% 的地方,你看到人们写的地方,interface Bar<T extends Bar<T>>写出来就和interface Bar<T>.

于 2012-12-11T03:52:40.427 回答