Java 引入字符串来定义类型
我想知道是否有办法做到这一点:Java 引入字符串来定义类型,java,Java,我想知道是否有办法做到这一点: String**type**=“Player” arraylistplayers=newarraylist() 我的意思是用变量字符串定义对象类型。我把“player”放在这里,它可以是player,但是一个可以引入变量类型的方法呢?大概是这样的: public static void main (String[] args) { system.out.println("Select a type that u wanna make an array of
String**type**=“Player”
arraylistplayers=newarraylist()代码>
我的意思是用变量字符串定义对象类型。我把“player”放在这里,它可以是player
,但是一个可以引入变量类型的方法呢?大概是这样的:
public static void main (String[] args)
{
system.out.println("Select a type that u wanna make an array of");
system.out.println("1. Player");
system.out.println("2. Team");
Scanner in = new Scaner (System.in);
createArray(in.next());
}
public static void createArray(String **type**)
{
ArrayList<**type**> x = new ArrayList();
}
publicstaticvoidmain(字符串[]args)
{
system.out.println(“选择一个你想要创建数组的类型”);
system.out.println(“1.Player”);
system.out.println(“2.Team”);
扫描仪输入=新的扫描仪(系统输入);
createArray(in.next());
}
公共静态void createArray(字符串**类型**)
{
ArrayList x=新的ArrayList();
}
这是可能的吗?远离思考,只需创建自己的类来捕获有关玩家的所有信息
public class Player {
// fields, methods to describe a player
}
public class Team {
// fields, methods to describe a team
}
然后,您的ArrayList
将按预期工作
List<Player> players = new ArrayList<>();
List<Team> teams = new ArrayList<>();
List players=new ArrayList();
列表团队=新建ArrayList();
作为旁注:您当前的代码结构只会在该方法中创建列表,之后就不可用了。如果您想要它回来,您必须返回ArrayList
,或者,当您使用它时,在main
中声明它。我非常确定,使用注释和自定义注释处理器是可能的(但可能不是一个好主意)
那么你的代码看起来像
@StringlyType String type="Player"
您必须编写一个定制的注释处理器,每当它遇到@StringlyType
注释时,它就会像其他答案所建议的那样创建一个类
但重点是什么呢?
免责声明:我并没有实际尝试过这一切;我也不打算这样做。所以我不能保证它能工作。没有理由这样做:
泛型类型仅用于编译时的类型检查。您需要了解这一点,您所做的工作(在运行时确定泛型类型)不需要泛型类型
你可以简单地做
List objects = new ArrayList();
然后继续将任何类型放入其中,但在从列表中取出对象后,显然必须先将对象转换为正确的类型才能使用它们。老实说,这将是一个有趣的GitHub项目。但是,创建注释处理器所需的一切所涉及的工作比创建类要多出几个数量级。@Makoto我将此作为OP的练习。如果他/她这样做并发布github链接,那就太酷了。我可能会看它,但不会使用它。哇,你实际上是对的,它可以这样做,但老实说,我非常不鼓励创建这样令人讨厌的好,重点是我想在一个db4o数据库中搜索,我在该数据库中有4种类。然后,当我想得到一个对象时,我可以用它来得到一个或另一个具有相同方法的类,具体取决于我介绍的(字符串“class”)。@Alejandro93sa我认为在java中是最好的答案。我会劝阻我的回答(从技术上讲是正确的,但实际上几乎没有用)。如果您想尝试其他JVM语言,那么我认为这在Clojure中会更容易。我认为在该解决方案中可以重用许多代码,但正如一些人告诉我的那样,这似乎是不可能的。非常感谢您的回答:)如果它们之间有一个共同的接口,那么您可以做一些正常的事情,而不是像这样工作。如果没有,那么您的代码无论如何也没有任何意义。