在Java和数字类型中使用泛型

时间:2012-10-05 21:05:12

标签: java generics

嘿,我刚刚开始学习Java课程,我将很快就开始学习(是的,我是一个书呆子,我在开始上课前学习)。我想把几个概念放在一起,以了解一切如何在Java中协同工作。

现在,我想要尝试做的是一个简单的Shape(Forme in french)类,它至少有1-2个继承自它的类,并在集合对象中创建一些实例。我也想让那些类泛型也尝试一下。这是我遇到麻烦的部分。

我已经习惯了C ++,所以这可能是混乱的地方,但似乎我不能使用泛型,所以,例如,我可以指定尺寸将在,例如,整数或双或漂浮或其他什么。有可能吗?

由于basehauteur,以下GetArea()方法无法编译。

package testconcepts;

import java.util.*;
import java.lang.*;

abstract class Forme <T extends Number> {
    protected String nom_forme;

    String NomForme() { return nom_forme; }

    abstract Double GetArea();
}

class Triangle <T extends Number> extends Forme {
    protected T base, hauteur;

    Triangle() { 
        this.nom_forme = "TRIANGLE"; 
    }

    @Override
    Double GetArea() { return base * hauteur / 2; }

    T GetBase() { return base; }
    T GetHauteur() { return hauteur; }
    void SetBase(T base) { this.base = base; }
    void SetHauteur(T hauteur) { this.hauteur = hauteur; }
}

public class TestConceptsJava {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(new Triangle<Double>());
    }
}

请注意,由于类型问题,我也无法在构造函数中将赋值赋值为0。

此外,我知道有非常相似的主题,但在其他问题中我还没有找到解决问题的方法。

TLDR如何使用基本类型包装器(Double,Integer ..)创建工作泛型?

5 个答案:

答案 0 :(得分:6)

所以你的问题就在这一行我想:

Double GetArea() { return base * hauteur / 2; }

您收到错误的原因是因为*操作符未定义Number类型的对象。既然你知道你将处理intdouble(我假设),你可以试试这个:

Double GetArea() { return base.doubleValue() * hauteur.doubleValue() / 2; }

作为注释,通常我们使用小写字母开始方法名称,即getArea()

答案 1 :(得分:3)

在GetArea()中,您在两个类上调用*运算符。说出这样的话有多大意义:

Object o1 = //whatever;
Object o2 = //whatever;

return o1 * o2;

不太对吗?你不能将两个类相乘。您实际想要做的是将这些包装类的基础值相乘(这在Java中不是为您隐式完成的)。像这样重写GetArea()可以解决你的问题:

Double GetArea() { return base.doubleValue() * hauteur.doubleValue() / 2; }

请注意,您还必须在该类中关注它的任何其他位置使用基础值。

答案 2 :(得分:1)

更改为Double GetArea() { return base.doubleValue() * hauteur.doubleValue() / 2; }将使代码编译,但这在Java中是个坏主意,因为java中的泛型不适用于此。基本上,它们只是在使用对象集合时确保静态类型安全。

Java没有运算符重载,所以你不能指望*能够处理除基本类型之外的任何事情。

我建议阅读基本的Java泛型教程,以了解它们在Java中的用途:http://docs.oracle.com/javase/1.5.0/docs/guide/language/generics.html

答案 3 :(得分:1)

看看你计算的这一部分:

base * hauteur

由于 basehauteur都是使用包装类声明的,因此您不能像使用基本类型那样使用*运算符。相反,您需要明确地获取值:

base.doubleValue() * hauteur.doubleValue()

请注意,如果使用基本类型声明basehauteur,则不会出现问题。然后,Java编译器将能够使用自动拆箱将另一个转换为适当的类型并执行所需的任何隐式转换。

答案 4 :(得分:1)

您正在寻找的是“自动(非)拳击”。不幸的是,T上的操作必须对Number所有子类型有效,而“自动(非)拳击”不是这样的操作(例如,它不起作用与BigInteger)。