在Java中转换浮点int

在Java中转换浮点int,java,class,Java,Class,我是Java新手,不知道如何将给定变量转换为int。我已经完成了以下工作: public class Ulamek<T> { private T licznik; private T mianownik; public Ulamek(T licznik, T mianownik) { this.licznik = licznik; this.mianownik = mianownik; } 公共类Ulamek{ 列克

我是Java新手,不知道如何将给定变量转换为int。我已经完成了以下工作:

public class Ulamek<T> {
    private T licznik;
    private T mianownik;

    public Ulamek(T licznik, T mianownik) {
        this.licznik = licznik;
        this.mianownik = mianownik;
    }
公共类Ulamek{
列克兹尼克;
私人T mianownik;
公共乌拉梅克(利兹尼克、米亚诺尼克){
this.licznik=licznik;
this.mianownik=mianownik;
}
我希望变量
licznik
mianownik
始终是
int
的类型,即使我创建了一个带有float或double的对象
Ulamek
。是否有方法转换它们或其他方法?
我必须使用
公共类Ulamek中的
来实现这一点,这里有一种可能的方法

    public static <T> int value(T v) {
        int k;
        if (v instanceof Double) {
            k = ((Double)v).intValue();
            return k;
        }
        return -1; // error, only valid for positive values of v.
    }

您可以使该类成为非泛型类,并使用方法重载来支持使用不同类型实例化该类

范例

public class Ulamek {
    private int licznik;
    private int mianownik;

    public Ulamek(int licznik, int mianownik) {
        this.licznik = licznik;
        this.mianownik = mianownik;
    }

    public Ulamek(double licznik, double mianownik) {
        this.licznik = (int)licznik;
        this.mianownik = (int)mianownik;
    }
}

看起来您的目标是创建一个方法(在本例中,它是一个构造函数,但原则适用于一般的方法),该方法接受任何类型的数字,然后将这些数字转换为整数值并存储

如果:

  • 您希望允许任何数字类型并避免方法重载
  • 您接受数字可能被截断、舍入甚至溢出为负值(例如,当您提供的
    long
    值大于
    Integer.MAX\u值时)
  • 并且您希望避免在调用构造函数时必须执行类型转换(因此在特定情况下,
    int
    s作为参数可能不是一个选项)
您可以使用一个利用Java的实现,并且这些装箱的数字类型都扩展了:
Number

公共类Ulamek{
里兹尼克私人酒店;
米亚诺尼克私人酒店;
公共乌拉梅克(数字利兹尼克,数字米亚努尼克){
this.licznik=对象
.requirennull(licznik,“licznik不能为null”)
.intValue();
this.mianownik=对象
.requireNonNull(mianownik,“mianownik不能为空”)
.intValue();
}
}
不需要泛型类型参数

请注意,我在那里添加了一个显式的
requirennoull
。您没有指定如何处理
null
值,而且您的目标数据类型(
int
)没有
null
的表示形式。因此,可以安全地假设
null
在这里是不可接受的

现在你可以写:

var a=new-Ulamek(42,43);//int
var b=new-Ulamek(42.0,43.0);//double
var c=新乌拉梅克(42l,43l);//长
var d=新的Ulamek(新的BigDecimal(42.0),新的BigDecimal(43.0));

使用这种方法,如果您需要,在分配整数值之前添加范围检查可能会更具挑战性。

然后将它们声明为
int
类型,而不是
T
。如果我将它们声明为int,构造函数会说它需要int类型,但它必须与T一起,因为我希望能够给定float或double,那么您希望/期望如何将某种类型的
T
转换为
int
?如果是
String
,您会这样做。但是Java是否知道只给定
T
?只要您的角色加倍,您就可以摆脱基于
int
的构造函数,因为双构造函数将处理int、float和d加倍。可能从纯技术角度来看,但是如果一个具有int成员的类没有一个接受int参数的构造函数,这将令人困惑。此外,我想演示在支持其他类型的情况下如何使用方法重载。
public class Ulamek {
    private int licznik;
    private int mianownik;

    public Ulamek(int licznik, int mianownik) {
        this.licznik = licznik;
        this.mianownik = mianownik;
    }

    public Ulamek(double licznik, double mianownik) {
        this.licznik = (int)licznik;
        this.mianownik = (int)mianownik;
    }
}