java – 将带有泛型参数的类传递给注释
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 将带有泛型参数的类传递给注释,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1594字,纯文字阅读大概需要3分钟。
内容图文
![java – 将带有泛型参数的类传递给注释](/upload/InfoBanner/zyjiaocheng/735/9885b57d3e064395940e0799cc30b778.jpg)
我想知道为什么Java编译器不接受这个赋值:
Class<? extends List<?>> blbost = ArrayList.class;
请注意,我对Class< ;?等解决方案不感兴趣扩展名单<?>> blobst =(类<?extends List<?>>)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();
}
}
我不能在注释中使用强制转换,因为值必须是常量.
为什么我不能将SomeFunction作为参数传递给SomeAnnotation,我该怎么做呢?
解决方法:
ArrayList不是List<?>的子类型的原因是因为Java中的泛型是不变的,这意味着对于任何两种不同类型Type1和Type2,List< Type1>既不是List< Type2>的子类型也不是超类型.
这也扩展到原始类型和参数化类型,这意味着像ArrayList这样的原始类型永远不能是像List< Type1>这样的参数化类型的子类型或超类型.并且,或许更直观地,参数化类型如ArrayList< Type1>永远不能像List这样的原始类型的子类型,即使ArrayList是List的子类型.
从内部类型中删除通配符将允许您将原始类型类传递给注释:
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();
}
}
}
还不能从List< String>等参数化类型中获取类文字.对于任何类型的Type,List< Type> .class将是语法错误,因此允许使用此处的原始类型,即使通常您不应使用原始类型.
内容总结
以上是互联网集市为您收集整理的java – 将带有泛型参数的类传递给注释全部内容,希望文章能够帮你解决java – 将带有泛型参数的类传递给注释所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。