Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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 - Fatal编程技术网

简单Java泛型问题

简单Java泛型问题,java,generics,Java,Generics,我想有一个方法来计算Integer、Double和Float类型的LinkedList的平均值 问题是sum+=i语句,因为java说没有为类型对象定义+运算符 我可以执行强制转换,但是如果LinkedList是Float类型,并且强制转换为Integer,那么我就无法计算正确的平均值 我该怎么办?谢谢 public double mean (LinkedList<?> l) { double sum = 0; int n = 0; for (Object i : l

我想有一个方法来计算Integer、Double和Float类型的LinkedList的平均值

问题是
sum+=i语句,因为java说没有为类型对象定义+运算符

我可以执行强制转换,但是如果LinkedList是Float类型,并且强制转换为Integer,那么我就无法计算正确的平均值

我该怎么办?谢谢

 public double mean (LinkedList<?> l)
 {
  double sum = 0;
  int n = 0;
  for (Object i : l)
  {
   n++;
   sum += i;
  }

  return sum / n;
 }
公共双平均值(LinkedList l)
{
双和=0;
int n=0;
用于(对象i:l)
{
n++;
总和+=i;
}
返回和/n;
}

您应该将列表限制为s。这是
整数
浮点
双精度
和其他数值类型的常见超类。它没有定义运算符,只定义了转换方法,例如,
double
,但这就足够了:

 public double mean (LinkedList<? extends Number> l)
 {
  double sum = 0;
  int n = 0;
  for (Number i : l)
  {
   n++;
   sum += i.doubleValue();
  }

  return sum / n;
 }
公共双均值(LinkedList
公共双均值(LinkedList l){
双和=0;
int n=0;
for(ti:l){
n++;
sum+=i.doubleValue();
}
返回和/n;
}

在Java中,泛型集合是反向的。这意味着,如果父类A和扩展了A的类B,则不能生成类似于
List=new LinkedList();
的内容


但是允许这种类型的替换是有可能的:您可以使用类似于
List的结构。唯一的选择是在
java.lang.Number
上进行泛化,但它实际上没有多大帮助,因为您无法将一个数解装箱到任何可以应用于基本算术运算符的对象。因此,您仍然必须检查r在数字对象上的每一个数字类型和调用号。
  • 允许收集而不仅仅是列表
  • 您不需要单独的变量“n”,只需使用l.size()
  • 注意空/空输入

  • 看起来和Peter的答案非常相似。啊哈…太聪明了…你有没有想过我会对问题片段进行c&p编辑?是的,但你编辑的唯一一件事是不会给Peter提出的答案添加任何值。使用只有一个参数的通用方法是没有用的。事实上,如果你看到发布时间,我以前就发布了。实际上,3分钟不会编译。没有为对象定义+运算符。整个
    表示我们有一个未知类型的LL,而
    LinkedList为什么不
    LinkedList
    ?回答第一个问题:是的,使用
    LinkedList
    指定一个包含未知类型元素的链接列表(它们至少是对象)和
    LinkedList@Tony,这称为带扩展名的通配符。
    LinkedList@Willi,如果您想反映其他人的评论,建议在您的回答中包括他的尼克,前面加一个@(例如@Tony)-否则他不会收到你的评论的通知。你不应该需要
    LinkedList
    ,因为你所做的一切都是迭代
    l
    中的元素。只需使用
    Iterable即可
    
    public <T extends Number> double mean (LinkedList<T> l) {
      double sum = 0;
      int n = 0;
      for (T i : l)  {
        n++;
        sum += i.doubleValue();
      }
    
      return sum / n;
    }
    
     public double mean (List<? extends Number> l)
     {
      double sum = 0;
      int n = 0;
      for (Object i : l)
      {
       n++;
       sum += i;
      }
    
      return sum / n;
     }