Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将类型参数传递给泛型 公共类G{ xi; } 公共E类{ 公共静态void main(字符串[]args){ G b1=新的G(); G b2=新的G(); b1.i=50; b2.i=“开始”; 系统输出打印LN(b1.i); 系统输出打印LN(b2.i); } }_Java_Generics - Fatal编程技术网

Java 将类型参数传递给泛型 公共类G{ xi; } 公共E类{ 公共静态void main(字符串[]args){ G b1=新的G(); G b2=新的G(); b1.i=50; b2.i=“开始”; 系统输出打印LN(b1.i); 系统输出打印LN(b2.i); } }

Java 将类型参数传递给泛型 公共类G{ xi; } 公共E类{ 公共静态void main(字符串[]args){ G b1=新的G(); G b2=新的G(); b1.i=50; b2.i=“开始”; 系统输出打印LN(b1.i); 系统输出打印LN(b2.i); } },java,generics,Java,Generics,本案例与下文给出的其他案例有何不同 public class G<x> { x i; } public class E { public static void main(String[] args) { G<Integer> b1 = new G<Integer>(); G<String> b2 = new G<String>(); b1.i = 50; b2.i = "start";

本案例与下文给出的其他案例有何不同

public class G<x> {
  x i;
}

public class E {
  public static void main(String[] args) {
    G<Integer> b1 = new G<Integer>();
    G<String> b2 = new G<String>();
    b1.i = 50;
    b2.i = "start";
    System.out.println(b1.i);
    System.out.println(b2.i);
  }
}
公共类G{
xi;
}
公共E类{
公共静态void main(字符串[]args){
G b1=新的G();
G b2=新的G();
b1.i=50;
b2.i=“开始”;
系统输出打印LN(b1.i);
系统输出打印LN(b2.i);
}
}
我知道,当您创建G类的对象时,我们必须为泛型定义类型参数,但如果不传递类型参数,它将工作..输出将显示。 所以为什么我的老师说类型参数很重要,尽管代码运行时也没有类型参数


这两种情况都有区别。在第一种情况下,我们通过引用变量b1传递整数类型参数,通过b2引用变量传递字符串类型参数,但在第二种情况下,我们没有这样做。在第二种情况下不这样做,数据类型将是对象类型。这两个代码都会给出相同的答案,但我的老师说你必须始终使用1个case。所以我的问题是他为什么这么说,因为两个代码都会给出相同的答案,所以为什么我们不能使用2个case呢?我想你的意思是,这个编译:

public class G<x> {
  x i;
}

public class E {
  public static void main(String[] args) {
    G b1 = new G();
    G b2 = new G();
    b1.i = 50;
    b2.i = "start";
    System.out.println(b1.i);
    System.out.println(b2.i);
  }
}
这恰好是作为
PrintStream工作的。println
Object
有一个重载,因此将接受任何对象。通常你会想调用一个更有趣的方法

顺便说一句,仍然可能有差异。由于
PrintStream
的特殊设计,此代码将做一些不同的事情

G b1=new G();
G b2=new G();

b1.i=50;
b2.i="start";
System.out.println(b1.i);
System.out.println(b2.i);
gb1=newg();
G b2=新的G();
b1.i=“开始”。toCharArray();
b2.i=“开始”。toCharArray();
系统输出打印LN(b1.i);
系统输出打印LN(b2.i);

您将收到警告。一般来说,您希望将警告视为错误。

我想您的意思是这样编译:

public class G<x> {
  x i;
}

public class E {
  public static void main(String[] args) {
    G b1 = new G();
    G b2 = new G();
    b1.i = 50;
    b2.i = "start";
    System.out.println(b1.i);
    System.out.println(b2.i);
  }
}
这恰好是作为
PrintStream工作的。println
Object
有一个重载,因此将接受任何对象。通常你会想调用一个更有趣的方法

顺便说一句,仍然可能有差异。由于
PrintStream
的特殊设计,此代码将做一些不同的事情

G b1=new G();
G b2=new G();

b1.i=50;
b2.i="start";
System.out.println(b1.i);
System.out.println(b2.i);
gb1=newg();
G b2=新的G();
b1.i=“开始”。toCharArray();
b2.i=“开始”。toCharArray();
系统输出打印LN(b1.i);
系统输出打印LN(b2.i);

您将收到警告。通常,您希望将警告视为错误。

第一种情况是类型安全的。 在第一种情况下,您已经声明
b1.i
只接受
整数
,因此您不能错误地将i.e.
字符串
赋给它。您可以信赖它包含
整数


在第二种情况下,您可以将对象的任意子体指定到
b1.i
中,这样类型安全性就消失了。您不能如此确定
b1.i
包含特定类型。

第一种情况是类型安全的。 在第一种情况下,您已经声明
b1.i
只接受
整数
,因此您不能错误地将i.e.
字符串
赋给它。您可以信赖它包含
整数


在第二种情况下,您可以将对象的任意子体指定到
b1.i
中,这样类型安全性就消失了。您不能确定
b1.i
包含特定类型。

此代码与我的代码有很大不同。在您的代码中,2行将给出错误,但在我的情况下,在运行代码时,您将不会发现任何错误和例外。还有一件事G b2=new G();这样做你会得到结果。这一行b1.i=“start”.toCharArray()将显示什么内容;给出输出,以及为什么这个代码与我的不同。在您的代码中,2行将给出错误,但在我的情况下,在运行代码时,您将不会发现任何错误和例外。还有一件事G b2=new G();这样做你会得到结果。这一行b1.i=“start”.toCharArray()将显示什么内容;给出输出和原因