Java泛型-多个问题(类型不在范围内,警告)

Java泛型-多个问题(类型不在范围内,警告),java,generics,Java,Generics,我有几个类需要是泛型的。我有下面的类数据集,我希望能够生成传递到实现可测量接口或测量器接口的类中的任何类型对象的平均值和最大值 当我去测试我的代码时,我得到的错误是我的类型不在范围内。有什么想法吗?当我从数据集中排除Measurer时,测试将编译。我不确定我是否正确地将数据集设置为通用数据集 DataSet.java public class DataSet<T extends Measurable<Double> & Measurer<Double>>

我有几个类需要是泛型的。我有下面的类数据集,我希望能够生成传递到实现可测量接口或测量器接口的类中的任何类型对象的平均值和最大值

当我去测试我的代码时,我得到的错误是我的类型不在范围内。有什么想法吗?当我从数据集中排除Measurer时,测试将编译。我不确定我是否正确地将数据集设置为通用数据集

DataSet.java

public class DataSet<T extends Measurable<Double> & Measurer<Double>>//
{
   /**
      Constructs an empty data set.
   */
   public DataSet()
   {
      this.sum = 0;
      this.count = 0;
      this.maximum = null;
   }

   /**
      Adds a data value to the data set.
      @param x a data value
   */
   public void add(T x)
   {

      sum = sum + x.getMeasure();
      if (count == 0 || maximum.getMeasure() < x.getMeasure())
      maximum = x;
      count++;
   }



   /**
      Gets the average of the added data.
      @return the average or 0 if no data has been added
   */
   public double getAverage()
   {
      if (count == 0) return 0;
      else return sum / count;
   }

   /**
      Gets the largest of the added data.
      @return the maximum or 0 if no data has been added
   */
   public T getMaximum()
   {
      return maximum;
   }

   private double sum;
   private T maximum;
   private int count;
}
公共类数据集//
{
/**
构造一个空数据集。
*/
公共数据集()
{
此值为0.sum=0;
此值为0.count;
this.max=null;
}
/**
将数据值添加到数据集。
@参数x数据值
*/
公共无效添加(T x)
{
sum=sum+x.getMeasure();
if(count==0 | | max.getMeasure()
datasetest.java

import java.awt.Rectangle;

public class DataSetTest
{
    public static void main(String[] args)
    {
        DataSet<BankAccount<Double>> ds1 = new DataSet<>();
        BankAccount<Double> ba1 = new BankAccount<>(100.00);
        BankAccount<Double> ba2 = new BankAccount<>(300.00);    
    }
}
导入java.awt.Rectangle;
公共类数据集
{
公共静态void main(字符串[]args)
{
数据集ds1=新数据集();
银行账户ba1=新银行账户(100.00);
银行账户ba2=新银行账户(300.00);
}
}
BankAccount.java

public class BankAccount<T> implements Measurable<T>
{
    public BankAccount()
    {
        balance = null;
    }
    public BankAccount(T balance)
    {
        this.balance = balance;
    }
    public T getMeasure()
    {
        return balance;
    }
    private T balance;
}
公共类银行账户实现可测量
{
公共银行账户()
{
余额=空;
}
公共银行账户(T余额)
{
这个平衡=平衡;
}
公共T getMeasure()
{
收益余额;
}
私人T余额;
}
java

/**
   Describes any class whose objects can be measured.
*/
public interface Measurable <T>
{
   /**
      Computes the measure of the object.
      @return the measure
   */
   T getMeasure();
}
/**
描述其对象可以测量的任何类。
*/
可测量的公共接口
{
/**
计算对象的度量值。
@退量
*/
T getMeasure();
}
java

/**
   Describes any class whose objects need a measurer.
*/
public interface Measurer <T>
{
   /**
      Computes the measurer of the object.
      @return the measurer
   */
    T getMeasurer(T anObject);

}
/**
描述其对象需要度量器的任何类。
*/
公共接口测量器
{
/**
计算对象的度量值。
@返回测量器
*/
T getMeasurer(T对象);
}
矩形形状.java

import java.awt.Rectangle;

/**
Concrete Class RectangleMeasurer
@param Takes object as parameter. Overloads measurer class.
@return Returns the area of a object passed in.
*/
public class rectangleShape<T> implements Measurer<T>{
    public T getMeasurer(T anObject)
    {
        Rectangle aRectangle = (Rectangle) anObject;
        Double area = aRectangle.getWidth() * aRectangle.getHeight();

        //@SuppressWarnings("unchecked")
        a = (T)area;
        return a;
    }

    private T a;
}
导入java.awt.Rectangle;
/**
混凝土类矩形测量仪
@param将对象作为参数。重载measurer类。
@返回传入对象的区域。
*/
公共类矩形形状实现了Measurer{
公共T获取测量器(T对象)
{
矩形aRectangle=(矩形)一个对象;
双面积=aRectangle.getWidth()*aRectangle.getHeight();
//@抑制警告(“未选中”)
a=(T)面积;
返回a;
}
私人旅行社;
}
类型边界
意味着参数扩展了可测量和测量器,但您希望它是或。使用泛型参数语法无法做到这一点

但是,您可以在
数据集中使用重载方法

public add(Measurable<Double> m) {
    //...
}

public add(Measurer<Double> m) {
    //...
}

基本上,您的用例不需要类上的类型参数。您正试图使问题适合您的解决方案,而不是相反。

嗯,BankAccount没有实现Measurer。您的数据集似乎没有使用Measurer之外的任何内容。你确定需要它吗?@markspace有没有办法让数据集利用来自可测量和测量器的方法,让BankAccount不需要实现测量器?@KarlM有,我还需要向其中传递一个名为rectangle的类。为了工作,我需要得到矩形的面积。我将编辑上面的内容。我真正想做的是,如果我有一个类使用了
int
,例如,我希望它能够使用它,而不必为其他类创建更多的代码。但是如果我像这样重载它:
public add(m)
我不能在类中做任何简单的算术。我不确定这是否非常清楚。@user2610654如果您将
T
绑定到
T extends Number
,然后使用
m.doubleValue()
,所有数字都有。更令人担忧的是在货币相关的任务中使用double-double是不精确的。使用
int
表示美分数-这是精确的(以及银行如何处理IRL)
public add(Object o) {
    if (o instanceof Measurable) {
        //...
    } else if (o instanceof Measurer) {
        //...
    }
}