Java 将带有泛型参数的类传递给注释
我想知道为什么Java编译器不接受此分配:Java 将带有泛型参数的类传递给注释,java,generics,types,Java,Generics,Types,我想知道为什么Java编译器不接受此分配: Class<? extends List<?>> blbost = ArrayList.class; Class>blbost=ArrayList.Class; 请注意,我对解决方案不感兴趣,例如Class>blobst=(Class>)ArrayList.Class,我想知道为什么可以使用它 最初的动机是在注释中使用泛型: @SomeAnnotation(SomeFunction.class) // Syntax err
Class<? extends List<?>> blbost = ArrayList.class;
Class>blbost=ArrayList.Class;
请注意,我对解决方案不感兴趣,例如Class>blobst=(Class>)ArrayList.Class
,我想知道为什么可以使用它
最初的动机是在注释中使用泛型:
@SomeAnnotation(SomeFunction.class) // Syntax error here!
private static class SomeClass {
}
private @interface SomeAnnotation {
Class<? extends Function<?, ?>> value();
}
private static class SomeFunction<T> implements Function<T, String> {
@Override
public String apply(T t) {
return t.toString();
}
}
import java.util.function.Function;
public class Example {
@SomeAnnotation(SomeFunction.class)
private static class SomeClass {
}
private @interface SomeAnnotation {
Class<? extends Function> value();
}
private static class SomeFunction<T> implements Function<T, String> {
@Override
public String apply(T t) {
return t.toString();
}
}
}
@SomeAnnotation(SomeFunction.class)//此处出现语法错误!
私有静态类SomeClass{
}
私有@interface注释{
类>值();
}
私有静态类SomeFunction实现函数{
@凌驾
公共字符串应用(T){
返回t.toString();
}
}
我不能使用强制转换注释,因为该值必须是常量
为什么我不能将
SomeFunction
作为参数传递给SomeAnnotation
,我能做些什么?为什么ArrayList
不是List
的子类型,是因为Java中的泛型是不变的
,这意味着对于任何两种不同的类型Type1
和Type2
,List
既不是List
的子类型,也不是它的超类型
这也扩展到了原始类型和参数化类型,这意味着像ArrayList
这样的原始类型永远不能是像List
这样的参数化类型的子类型或超级类型,也许更直观地说,像ArrayList
这样的参数化类型永远不能是像List
这样的原始类型的子类型,即使ArrayList
是List
的子类型
从内部类型中删除通配符将允许您将原始类型类传递到注释中:
@SomeAnnotation(SomeFunction.class) // Syntax error here!
private static class SomeClass {
}
private @interface SomeAnnotation {
Class<? extends Function<?, ?>> value();
}
private static class SomeFunction<T> implements Function<T, String> {
@Override
public String apply(T t) {
return t.toString();
}
}
import java.util.function.Function;
public class Example {
@SomeAnnotation(SomeFunction.class)
private static class SomeClass {
}
private @interface SomeAnnotation {
Class<? extends Function> value();
}
private static class SomeFunction<T> implements Function<T, String> {
@Override
public String apply(T t) {
return t.toString();
}
}
}
import java.util.function.function;
公开课范例{
@SomeAnnotation(SomeFunction.class)
私有静态类SomeClass{
}
私有@interface注释{
类首先,简短的回答是Class
不是Class>
的子类型。实际上有一种关系,如下图所示:
Class
|
Class<?>
|
Class<? extends List>
/ \
Class<? extends List<?>> Class<? extends ArrayList>
| |
Class<List<?>> Class<ArrayList>
然后你就可以使用双函数了。class
我想这应该会有帮助:。class
不是类的子类哇,我不希望得到如此全面的答案!我接受了Marv的答案,因为他是第一个,我们使用了他的解决方案,但你的答案很好。谢谢你的解释。我很高兴能提供帮助。