我找到了类似下面的方法。
public void simpleTest(Class <? extends ParentClass> myClass){
}
我在这里不明白表达式:Class <? extends ParentClass> myClass
。
任何人都可以解释一下吗?
答案 0 :(得分:5)
Class <? extends ParentClass> myClass
是一个method argument,其类型为Class parameterized,以确保传递的内容是一个代表{{3}类型的类} ParentClass。
即。给出:
class ParentParentClass {}
class ParentClass extends ParentParentClass {}
class ChildClass extends ParentClass {}
class ChildChildClass extends ChildClass {}
public void simpleTest(Class <? extends ParentClass> myClass) {}
这些是有效的:
simpleTest(ParentClass.class);
simpleTest(ChildClass.class);
simpleTest(ChildChildClass.class);
这些无效,因为参数不适合所需的类型:
simpleTest(ParentParentClass.class);
simpleTest(String.class);
simpleTest(Date.class);
simpleTest(Object.class);
答案 1 :(得分:0)
来自java.lang.Class<T>
的javadoc:
T - 由此Class对象建模的类的类型。例如,String.class的类型是
Class<String>
。如果正在建模的类未知,请使用Class<?>
。
现在用你的类替换String:它是一个类型的Class,它是ParentClass或ParentClass的子类。
答案 2 :(得分:0)
类myClass - 表示myClass应该是Parent Class的子类型。
class MyClass extends ParentClass {
}
simpleTest(ParentClass.class); // this is ok
simpleTest(MyClass.class); // this is ok
class SomeOtherClass {
}
simpleTest(SomeOtherClass.class); // will result in compiler error
答案 3 :(得分:0)
这是一个采用参数化类的通用方法。
首先考虑一个更简单的泛型示例可能会有所帮助:List<? extends ParentClass>
表示它只是一个List,它只接受满足与ParentClass的is-a关系的对象。即List实现的参数是一个ParentClass,但整个事件List<? extends ParentClass>
的类型是List。
在您的示例中,只需替换“Class”而不是“List”。 myClass
是一个类,即您可以使用类似“MyClassName.class”的方法调用该方法。此外,我的类的类的参数是一个ParentClass。这基本上意味着您只能将Class of ParentClass或其子类传递给该方法。
另请参阅:http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html