Java将类型作为函数参数传入

Java将类型作为函数参数传入,java,Java,我来自Python背景,在Python中,您可以将对象的类型作为参数传入。但在Java中,您无法做到这一点,有没有关于如何让类似的东西工作的提示 private void function(Type TypeGoesHere) Stock s = new TypeGoesHere(); s.analyze(); } 在Java中,您可以传递一个类。您可以这样做: private void function(Class c) 但这并不是很常见的直肠疾病。通过研究策略模式或正确使

我来自Python背景,在Python中,您可以将对象的类型作为参数传入。但在Java中,您无法做到这一点,有没有关于如何让类似的东西工作的提示

private void function(Type TypeGoesHere)
    Stock s = new TypeGoesHere();
    s.analyze();
}

在Java中,您可以传递一个类。您可以这样做:

private void function(Class c)
但这并不是很常见的直肠疾病。通过研究策略模式或正确使用面向对象编程(多态性),您可能会得到您需要的东西

如果您正在寻找构建某些对象的方法,请查看Factory模式


如果您想创建一个泛型类,请查看以下详细答案:

Java不支持Python引用函数和类的方式。要实现这种行为,必须使用两种高级技术:泛型和反射。解释这些概念超出了SO回答的范围。您应该阅读Java指南来了解它们

然而,下面是一个示例,假设给定的类有一个无参数构造函数,它是什么样子的:

public <T extends Stock> void analyzeNewStock(Class<T> clazz) throws Exception {
  Stock s = clazz.newInstance();
  s.analyze();
}
你可以用。例如:

private <T> void function(Class<T> clazz) {
    try{
        T t = clazz.newInstance();
        //more code here
    }catch(InstantiationException | IllegalAccessException ex){
        ex.printStackTrace();
    }
}
//interface to implement
public interface Stock {
    public void analyze();
}

//rewrite of function
private void function(Stock s){
    s.analyze();
}
并使用两种方法调用
函数

//first way
public class XYZ implements Stock{
    public void analyze(){
        //some code here
    }
}

//calling the function
function(new XYZ());

//second way
function(new Stock(){
    public void analyze(){
        //your code here
    }
});

搜索“Java反射”(如中所示)可能会与更一般的搜索“Java反射”(如中所示)重复,这将为您提供一些相关信息。如果有参数被传递到Stock类中,代码会是什么样子?@budi I更新了第二个示例。实现取决于参数是否始终具有相同的值(
valueTwo
)或可以不同(
valueOne
)。@budi如果要使用第一个示例(我不建议这样做),您可以编写e。g<代码>clazz.getConstructor(String.class,String.class).newInstance(“嘿”,“ho”)。我成功了,你的代码很好用,谢谢!令人失望的是,在Java中没有更简单的方法来实现这一点(我非常想念Python),在这个答案中不需要泛型。如果您遵循擦除对代码所做的操作,只需传入一个基类型参数“Stock”将与泛型版本具有相同的效果。泛型是编译时的,他想要的是比泛型更多的反射。这很公平,但无论如何,接口可能更好。
//first way
public class XYZ implements Stock{
    public void analyze(){
        //some code here
    }
}

//calling the function
function(new XYZ());

//second way
function(new Stock(){
    public void analyze(){
        //your code here
    }
});