Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.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-如何选择泛型类类型;“在路上”;_Java_Class_If Statement_Generics_Declaration - Fatal编程技术网

Java-如何选择泛型类类型;“在路上”;

Java-如何选择泛型类类型;“在路上”;,java,class,if-statement,generics,declaration,Java,Class,If Statement,Generics,Declaration,我实现了一个泛型类,我想根据用户的选择创建一个具有特定类型的变量。 我希望无论用户选择什么,变量的名称都是相同的 到目前为止,我得到的是: public class MyGeneric <T> { ... } 公共类MyGeneric { ... } 主要内容: if(选项==1) MyGeneric项=新建MyGeneric(); 其他的 MyGeneric项=新建MyGeneric(); 我知道中的声明是禁止的 我能做什么 这样做的原因是 第一个选项更具可读性和“通用性”

我实现了一个泛型类,我想根据用户的选择创建一个具有特定类型的变量。 我希望无论用户选择什么,变量的名称都是相同的

到目前为止,我得到的是:

public class MyGeneric <T>
{
...
}
公共类MyGeneric
{
...
}
主要内容:

if(选项==1)
MyGeneric项=新建MyGeneric();
其他的
MyGeneric项=新建MyGeneric();
我知道
中的声明是禁止的

我能做什么


这样做的原因是


第一个选项更具可读性和“通用性”。

不要忘记,在Java中,当使用泛型()时,有一种叫做类型擦除的东西。它们在运行时不可用

实际上,如果您真的想知道
MyGeneric
中的类型,您必须将
MyGeneric
类型存储在
MyGeneric
类中。比如:

class MyGeneric{
private Class type; // (as an instance variable of MyGeneric). 
}

然后影响if中的类型。

不要忘记,在Java中,当使用泛型()时,有一种叫做类型擦除的东西。它们在运行时不可用

实际上,如果您真的想知道
MyGeneric
中的类型,您必须将
MyGeneric
类型存储在
MyGeneric
类中。比如:

class MyGeneric{
private Class type; // (as an instance variable of MyGeneric). 
}

然后影响if中的类型。

我猜您希望执行以下操作:

MyGeneric<?> item;
if (choice == 1) {
  item = new MyGeneric<Integer>();
} else {
  item = new MyGeneric<String>();
}
MyGeneric项;
如果(选项==1){
item=new MyGeneric();
}否则{
item=new MyGeneric();
}
但关键是:当你开始以这种方式使用泛型时。。。你失去了他们所有的优势。泛型的本质是为您提供一定量的类型安全性,这可以由编译器强制执行

无论实际使用哪种泛型类型,您使用“相同项”的想法都与此意图相矛盾。您也可以忘记使用泛型,只需到处使用Object即可

换句话说:所使用的具体通用类型是项目“类型”的基本部分。我在这里看到的唯一有效用例更像:

MyGeneric<? extends Number> item;
if (choice == 1) {
  item = new MyGeneric<Integer>();
} else {
  item = new MyGeneric<Float>();
}

MyGeneric我想你想做:

MyGeneric<?> item;
if (choice == 1) {
  item = new MyGeneric<Integer>();
} else {
  item = new MyGeneric<String>();
}
MyGeneric项;
如果(选项==1){
item=new MyGeneric();
}否则{
item=new MyGeneric();
}
但关键是:当你开始以这种方式使用泛型时。。。你失去了他们所有的优势。泛型的本质是为您提供一定量的类型安全性,这可以由编译器强制执行

无论实际使用哪种泛型类型,您使用“相同项”的想法都与此意图相矛盾。您也可以忘记使用泛型,只需到处使用Object即可

换句话说:所使用的具体通用类型是项目“类型”的基本部分。我在这里看到的唯一有效用例更像:

MyGeneric<? extends Number> item;
if (choice == 1) {
  item = new MyGeneric<Integer>();
} else {
  item = new MyGeneric<Float>();
}

MyGenericStep 1:了解泛型是什么,它们不是什么。如果语句
中的变量声明不是“禁止的”,它只是限制了范围。为什么要这样做?“无论你想做什么,这都不是办法。”克雷格8806-是的,我知道。。我的意思是它给了我一个错误…@khelwood我为你编辑..看一看第1步:了解泛型是什么,它们不是什么。如果语句
中的变量声明不是“禁止的”,它只是限制了范围。你为什么要这样做?“无论你想做什么,这都不是办法。”克雷格8806-是的,我知道。。我的意思是它给了我一个错误…@khelwood我为你编辑…看一看我不这么认为。你看,例如,如果你有一个整数列表或字符串列表,这会有所不同。您只向第一个列表添加整数,而只向第二个列表添加字符串。从这个意义上说,我认为Andy的第一个命令有点到位:你应该首先更好地理解泛型;也许你可以问一个更好的问题。。。或者相应地修改你的设计。有意义。非常感谢!我不这么认为。你看,例如,如果你有一个整数列表或字符串列表,这会有所不同。您只向第一个列表添加整数,而只向第二个列表添加字符串。从这个意义上说,我认为Andy的第一个命令有点到位:你应该首先更好地理解泛型;也许你可以问一个更好的问题。。。或者相应地修改你的设计。有意义。非常感谢!