Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将带有泛型参数的类传递给注释_Java_Generics_Types - Fatal编程技术网

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

我想知道为什么Java编译器不接受此分配:

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的答案,因为他是第一个,我们使用了他的解决方案,但你的答案很好。谢谢你的解释。我很高兴能提供帮助。