Java将Type作为函数参数传递

时间:2015-07-01 16:07:25

标签: java

我来自Python背景,在Python中,您可以将对象的类型作为参数传递。但是在Java中你不能这样做,关于如何使这样的工作的任何提示?

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

3 个答案:

答案 0 :(得分:2)

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

private void function(Class c)

虽然这不是很常见的。您可以通过查看策略模式或正确使用面向对象编程(多态)来获得您所需要的。

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

如果您想创建一个通用类,请查看详细答案:https://stackoverflow.com/a/1090488/1611957

答案 1 :(得分:2)

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

然而,这是一个示例,假设给定的类有一个无参数的构造函数:

public <T extends Stock> void analyzeNewStock(Class<T> clazz) throws Exception {
  Stock s = clazz.newInstance();
  s.analyze();
}

然后使用analyzeNewStock(MyStock.class)调用此函数。

由于这是一个相当复杂且容易出错的方法,因此您宁愿定义一个创建Stock个实例的接口:

public interface StockProvider {
  Stock createStock(String value);
}

public class MyStockProvider implements StockProvider {
  private final String valueTwo;

  public MyStockProvider(String valueTwo) {
    this.valueTwo = valueTwo;
  }

  @Override
  public Stock createStock(String valueOne) {
    return new MyStock(valueOne, valueTwo);
  }
}

public class MyOtherClass {
  public void analyzeNewStock(StockProvider provider) {
    provider.createStock("Hi!").analyze();
  }

  public static void main(String[] args) {
    analyzeNewStock(new MyStockProvider("Hey!"));
  }
}

答案 2 :(得分:1)

您可以使用generics。例如:

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

Class<T> clazz显示要实例化的类型。 try/catch只是为了防止错误停止代码。同样的想法在this SO post中得到了扩展。更多信息here

但是,我不确定你为什么要这样做。应该很容易使用简单的界面解决方法。由于您已经知道需要类型为Stock的对象,因此可以传递接口的实现。例如:

//interface to implement
public interface Stock {
    public void analyze();
}

//rewrite of function
private void function(Stock s){
    s.analyze();
}

使用两种方式拨打function

//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
    }
});