Java泛型使用难度

时间:2012-11-15 06:33:12

标签: java generics

我是java的新手......我很难理解泛型。根据我的理解,我编写了以下演示程序来理解泛型,但是有错误......需要帮助。

class GenDemoClass <I,S> 
{
    private S info;
    public GenDemoClass(S str)
    {
        info = str;
    }
    public void displaySolidRect(I length,I width)
    {
        I tempLength = length;
        System.out.println();
        while(length > 0)
        {
            System.out.print("          ");
            for(int i = 0 ; i < width; i++)
            {
                System.out.print("*");
            }
            System.out.println();
            length--;
        }
        info = "A Rectangle of Length = " + tempLength.toString() + " and Width = " + width.toString() + " was drawn;";     
    }

    public void displayInfo()
    {
        System.out.println(info);
    }
}

public class GenDemo
{
    public static void main(String Ar[])
    {
        GenDemoClass<Integer,String> GDC = new GenDemoClass<Integer,String>("Initailize");
        GDC.displaySolidRect(20,30);
        GDC.displayInfo();
    }
}

如果我用Integer中的StringGenDemoClass替换类型变量I和S,那么代码似乎有效.. 错误是

error: bad operand types for binary operator '>'
                while(length > 0)
                             ^
  first type:  I
  second type: int
  where I is a type-variable:
    I extends Object declared in class GenDemoClass

4 个答案:

答案 0 :(得分:2)

问题是大多数对象不适用于&gt;运营商。

如果声明类型I必须是Number的子类型,则可以在比较中将类型I的实例转换为int基元。例如

class GenDemoClass <I extends Number,S> 
{


public void displaySolidRect(I length,I width)
    {
        I tempLength = length;
        System.out.println();
        while(length.intValue() > 0)
        {

        }

此时你陷入困境,因为你不能像你想要的那样修改length值 - 它是不可变的。您可以使用plain int来实现此目的。

public void displaySolidRect(I length,I width)
    {
        int intLength = length.intValue();
        int intHeight = width.intValue();
        System.out.println();
        while(intLength > 0)
        {
           // iterate as you normally would, decrementing the int primitives
        }

在我看来,这不是对泛型的适当使用,因为你没有使用原始整数类型获得任何东西。

答案 1 :(得分:1)

如果您将不是Integer的内容传递给I length文件,会发生什么?现在你不是说它应该是任何特定的类型,所以如果你传入一个字符串,那么这一行会发生什么?

while(length > 0)

这里假设length是一个整数,当你非常明确地将其定义为I时。

答案 2 :(得分:1)

您应该在使用前检查instanceof

if (I instanceof Integer){ 
   // code goes here

}

答案 3 :(得分:0)

> op对任意类I无效。