通用混淆:通用超类中的类型在编译时未定义?

时间:2014-03-04 19:13:53

标签: java generics inheritance

刚刚遇到这段代码:

public class Container <T extends Containter<T>> {
    protected Map<String, Rule> inspect (T t) {
        // ....
    }
    public boolean isValid () {
        // ...
        inspect ((T)this);
        // ...
    }
}

我感到困惑的是“isValid” - 方法。

当您用inspect(this);替换该行时,它将无法编译:不兼容的类型:Container&lt; T&gt;无法转换为T.

在子类中,不会发生错误。所以我问自己:可能会出现this类型不是Container的情况吗?我的意思是上面代码中this的类型是什么?显式演员似乎没必要。

希望你们能理解我,我觉得很难用英语解释这样的东西。

谢谢!

更新

首先,谢谢你,抱歉让你久等。

关于检查方法的意图存在混淆。它应该适用于Container本身(而不是泛型类型)。基本上只有Container的子类应该能够使用它。所以整个事情都是关于继承。

它是关于使用inspect方法的子类的类型安全性。

想象一下像(在Container的inspect-method 中)的实例化:

List<T> listOfSimilarContainers = new LinkedList<T>();

现在,如果有一个类似

的子类
public class SubContainer extends Container<SubContainer> { }

在该类上调用inspect应该强制inspect方法中的listOfSimilarContainers只包含SubContainers。

这就是我想要实现的目标。

2 个答案:

答案 0 :(得分:4)

这是一个简化版本:

interface Foo<T extends Foo<T>> { }
class Bar implements Foo<Bar> { }
class Baz implements Foo<Bar> { }

请注意,Baz继承自Foo<Bar>,而非Foo<Baz>。代码编译没有任何错误。

换句话说,接口声明不保证TFoo<T>的子类。

答案 1 :(得分:0)

应该如何检查方法?如果你想检查泛型类型,那么T可以是Class<T>对象,否则检查签名sholud是:

 public class Container<T extends Container<T>> {
        protected Map<String, String> inspect(Container<T> t) {
        }
        public boolean isValid() {
            // ...
            inspect(this);
            // ...
        }
    }