我是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
中的String
和GenDemoClass
替换类型变量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
答案 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
无效。