我来自Python背景,在Python中,您可以将对象的类型作为参数传递。但是在Java中你不能这样做,关于如何使这样的工作的任何提示?
private void function(Type TypeGoesHere)
Stock s = new TypeGoesHere();
s.analyze();
}
答案 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
}
});