刚刚遇到这段代码:
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。
这就是我想要实现的目标。
答案 0 :(得分:4)
这是一个简化版本:
interface Foo<T extends Foo<T>> { }
class Bar implements Foo<Bar> { }
class Baz implements Foo<Bar> { }
请注意,Baz
继承自Foo<Bar>
,而非Foo<Baz>
。代码编译没有任何错误。
换句话说,接口声明不保证T
是Foo<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);
// ...
}
}