[英]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.