繁体   English   中英

Java将Type作为函数参数传递

[英]Java Passing in Type as Function Parameter

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

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

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

private void function(Class c)

但这不是很普遍的原因。 您可以通过查看策略模式或正确使用面向对象编程(多态)来获得所需。

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

如果你想创建一个通用的类 - 请看这个详细的答案: https//stackoverflow.com/a/1090488/1611957

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!"));
  }
}

你可以使用泛型 例如:

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只是为了防止错误停止代码。 这篇SO帖子中扩展了相同的想法。 更多信息在这里

但是,我不确定你为什么要这样做。 应该很容易使用简单的界面解决方法。 由于您已经知道需要类型为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
    }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM