我想用泛型和varargs实现一个函数。
public class Question {
public static <A> void doNastyThingsToClasses(Class<A> parent, Class<? extends A>... classes) {
/*** something here ***/
}
public static class NotQuestion {
}
public static class SomeQuestion extends Question {
}
public static void main(String[] args) {
doNastyThingsToClasses(Object.class, Question.class, SomeQuestion.class); // OK
doNastyThingsToClasses(Question.class, SomeQuestion.class); // OK
doNastyThingsToClasses(Question.class, Object.class, SomeQuestion.class); // compilation failure
}
}
这里的意图是断言传递给该函数的所有参数都是扩展作为第一个参数给出的Class的Class对象。因此main方法的前两行将进行编译,而第三行将生成错误。
我的问题是: 为什么前两行会显示“类型安全性:为varargs参数创建了Class的通用数组”消息?
我在这里想念什么吗?
附加问题: 如何重新设计它以防止在调用“ doNastyThingsToClasses”函数的每一行上显示此警告?我可以将其更改为“
doNastyThingsToClasses(Class parent,Class <?> …
classes)”并摆脱警告,但这也删除了编译时的类型检查-如果我想这样做不是很好确保正确使用此功能。有更好的解决方案吗?
与往常一样,Angelika
Langer的Java泛型常见问题解答对此进行了详细说明。(滚动到“为什么当我调用“
varargs”方法时,编译器有时会发出未经检查的警告?”-ID不能正常工作。)
基本上,您最终会以比正常情况更糟的方式丢失信息。Java泛型的另一个小问题是:
问题内容: 我有一个代表文本片段的泛型类。该文本片段可能具有多种不同模式(突出显示的不同类型)中的任何一种。这些模式用枚举表示。每个项目的Enum可能不同,但是它必须实现一个接口,该接口提供了一种将其中两个结合的方法(可以突出显示并加粗显示)。所以我有一个界面: 然后我的TextFragment是文本字符串和模式的容器。但是当我尝试声明该类时: 我收到以下错误: 令牌“扩展”的语法错误,预期 根据
问题内容: 我想创建一个比较数字的方法,但可以有一个输入,它是Number的任何子类。 我已经考虑过以以下方式进行此操作… 在进行比较之前,我需要获取实际的原始指令,Number类具有为每个原始指令检索此指令的方法,但是我想选择一种正确的方法。 这可能吗? 干杯 问题答案: 不幸的是,如果不依靠if / else块,就无法从包装器类型中获取原始类型。 问题在于,不可能以通用方式实现这种方法。以下是
问题内容: 这件事让我困扰了一阵子。我之前曾问过一些问题,但措辞可能很拙劣,而且例子太抽象了。所以目前尚不清楚我实际上在问什么。我会再尝试。并且请不要下结论。我希望这个问题根本不容易回答! 为什么我不能在Java中使用带有泛型类型参数的枚举? 问题不在于语法上为什么不可能做到这一点。我知道这只是不受支持。问题是:为什么JSR人员会“忘记”或“忽略”这个非常有用的功能?我无法想象与编译器相关的原因,
这可能是一个愚蠢的问题,所以请原谅我的无知。 如果我用: 编译器说foo.execute(val)是一个错误。带有一条沿着setWrapped方法(bar )行的消息,类型为foo 不适用于参数(bar )。 如果我想把福变成
如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或
主要内容:泛型集合,泛型类,泛型方法,泛型的高级用法前面我们提到 Java 集合有个缺点,就是把一个对象“丢进”集合里之后,集合就会“忘记”这个对象的数据类型,当再次取出该对象时,该对象的编译类型就变成了 Object 类型(其运行时类型没变)。 Java 集合之所以被设计成这样,是因为集合的设计者不知道我们会用集合来保存什么类型的对象,所以他们把集合设计成能保存任何类型的对象,只要求具有很好的通用性,但这样做带来如下两个问题: 集合对元素类型没有