首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要大师冥想的Java泛型警告

需要大师冥想的Java泛型警告
EN

Stack Overflow用户
提问于 2017-07-10 19:51:24
回答 4查看 145关注 0票数 0

我有一些Java代码,如下面的片段(示例是从原始代码中简化的)。如下面的代码注释所示,出现一条黄色的切换和警告消息。消息是:“此方法调用不安全,因为传递的参数可能类型错误。”

代码语言:javascript
复制
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的答案后,我修正了代码中的一个错误。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-07-10 20:34:10

实际上,该代码中有三个警告:

  1. 类型安全性:在abstract <S> Seek<S> seek(S... o);通过varargs参数o潜在的堆污染
  2. 类型参数T在abstract <T,T2> void map(Func<T,T2> call);中隐藏类型T
  3. 类型安全性:为X1的varargs参数在seek(some).map(c);上创建一个泛型数组

它可以清除警告。从泛型中取出varargs参数,如:

代码语言:javascript
复制
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.明确地定义数组,如:

代码语言:javascript
复制
  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[] oS... o完全不同。它只能显式地接受Array。也许你需要重新考虑你的设计?

IMHO:我真的不明白需要在类和方法级别同时拥有那么多泛型类型参数.

票数 1
EN

Stack Overflow用户

发布于 2017-07-10 19:54:25

map应该只使用T2作为类型参数,而不是T。现在,TT隐藏在Seek<T>类中,也就是说,您有两个名为T的类型变量,它们实际上是不同的,您不希望这样。

票数 1
EN

Stack Overflow用户

发布于 2017-07-10 20:01:33

我从编译代码中得到的警告与seek(S...)方法创建的泛型数组有关。

如果您可以将它更改为List<S>,则可以使用Arrays.asList()调用它。

代码语言:javascript
复制
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);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45020468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档