我有一些Java代码,如下面的片段(示例是从原始代码中简化的)。如下面的代码注释所示,出现一条黄色的切换和警告消息。消息是:“此方法调用不安全,因为传递的参数可能类型错误。”
abstract class Seek<T> {
abstract <S> Seek<S> seek(S... o);
abstract <T2> void map(Func<T,T2> call);
interface Func<I,O> {
public O call(I x);
}
public <X2> void go(Func<T,X2> c, T some) {
seek(some).map(c); // <- yellow squiggle here on 'c'
}
}为什么会出现警告?解决这个问题的最好方法是什么?
注意:我正在为Android使用AIDE开发环境。
编辑:在阅读了@tsolakp和@LouisWasserman的答案后,我修正了代码中的一个错误。
发布于 2017-07-10 20:34:10
实际上,该代码中有三个警告:
abstract <S> Seek<S> seek(S... o);通过varargs参数o潜在的堆污染abstract <T,T2> void map(Func<T,T2> call);中隐藏类型Tseek(some).map(c);上创建一个泛型数组它可以清除警告。从泛型中取出varargs参数,如:
abstract class Seek<T> {
abstract <S> Seek<S> seek(S o); // <- no more yellow squiggle
abstract <T1,T2> void map(Func<T1,T2> call); // <- no more yellow squiggle
interface Func<I,O> {
public O call(I x);
}
public <X1,X2> void go(Func<X1,X2> c, X1 some) {
seek(some).map(c); // <- no more yellow squiggle here on 'c'
}
}B.明确地定义数组,如:
abstract class Seek<T> {
abstract <S> Seek<S> seek(S[] o); // <- no more yellow squiggle
abstract <T2> void map(Func<T,T2> call); // <- no more yellow squiggle
interface Func<I,O> {
public O call(I x);
}
public <X1,X2> void go(Func<X1,X2> c, X1[] some) {
seek(some).map(c); // <- no more yellow squiggle
}
}但是,S[] o与S... o完全不同。它只能显式地接受Array。也许你需要重新考虑你的设计?
IMHO:我真的不明白需要在类和方法级别同时拥有那么多泛型类型参数.
发布于 2017-07-10 19:54:25
map应该只使用T2作为类型参数,而不是T。现在,T将T隐藏在Seek<T>类中,也就是说,您有两个名为T的类型变量,它们实际上是不同的,您不希望这样。
发布于 2017-07-10 20:01:33
我从编译代码中得到的警告与seek(S...)方法创建的泛型数组有关。
如果您可以将它更改为List<S>,则可以使用Arrays.asList()调用它。
abstract class Seek<T> {
abstract <S> Seek<S> seek(List<S> o);
// ...
public <X1,X2> void go(Func<X1,X2> c, X1 some) {
seek(Arrays.asList(some)).map(c);
}
}https://stackoverflow.com/questions/45020468
复制相似问题