有没有办法将参数参数绑定到Java中的函数指针,就像在C ++中使用std :: bind一样? Java相当于这样的东西是什么?
void PrintStringInt(const char * s, int n)
{
std::cout << s << ", " << n << std::endl;
}
void PrintStringString(const char * s, const char * s2)
{
std::cout << s << ", " << s2 << std::endl;
}
int main()
{
std::vector<std::function<void(const char *)>> funcs;
funcs.push_back(std::bind(&PrintStringInt, std::placeholders::_1, 4));
funcs.push_back(std::bind(&PrintStringString, std::placeholders::_1, "bar"));
for(auto i = funcs.begin(); i != funcs.end(); ++i){
(*i)("foo");
}
return 0;
}
答案 0 :(得分:2)
我不敢,但这段代码是一种模仿C ++模板的方法(很差):
abstract class Printer<T> {
final T value;
Printer( T v ) {
value = v;
}
public abstract void print( String s );
}
class PrintStringInt extends Printer< Integer> {
PrintStringInt( int v ) {
super( v );
}
@Override public void print( String s ) {
System.out.printf( "%s, %d\n", s, value );
}
}
class PrintStringString extends Printer< String > {
PrintStringString( String v ) {
super( v );
}
@Override public void print( String s ) {
System.out.printf( "%s, %s\n", s, value );
}
}
public class BindTest {
public static void main( String[] args ) {
Printer<?>[] funcs = {
new PrintStringInt( 4 ),
new PrintStringString( "bar")
};
for( Printer<?> p : funcs ) {
p.print( "foo" );
}
}
}
输出:
foo, 4
foo, bar
答案 1 :(得分:2)
我认为你可以逐行翻译,bind
不会将1:1映射到任何Java结构;
static void PrintStringInt(String s, int n)
{
System.out.println(s + ", " + n);
}
static void PrintStringString(String s, String s2)
{
System.out.println(s + ", " + s2);
}
interface MyCall {
void fn(String value);
}
public static void main(String[] argv)
{
Vector<MyCall> funcs = new Vector<MyCall>();
funcs.add(new MyCall() {
@Override public void fn(String value) {PrintStringInt(value, 4); }});
funcs.add(new MyCall() {
@Override public void fn(String value) {PrintStringString(value, "bar"); }});
for(MyCall i : funcs){
i.fn("foo");
}
}
答案 2 :(得分:1)
从Java7开始,也可以使用方法句柄执行相同操作,有关详细信息,请参阅类java.lang.invoke.MethodHandle
的API文档。
答案 3 :(得分:0)
您可以使用所需签名的函数创建一个匿名类,该调用将调用转发给原始函数。
假设你有这些功能:
public class StringPrinter {
public void printStringInt( String s, int n ) {
System.out.println( s + ", " + n );
}
public void printStringString( String s, String s2 ) {
System.out.println( s + ", " + s2 );
}
}
然后,您可以创建有效绑定这些函数的参数的匿名类。
public static void main( String[] args ) {
public interface Print1String {
public void printString( String s );
}
List<Print1String> funcs = new ArrayList<Print1String);
funcs.add( new Print1String() {
public void printString( String s ) {
new StringPrinter( ).printStringInt( s, 42 );
}});
funcs.add( new Print1String() {
public void printString( String s ) {
new StringPrinter( ).printStringString( s, "bar" );
}});
for ( Print1String func : funcs ) {
func.print1String("foo");
}
}
答案 4 :(得分:0)
使用MethodHandle,这是一个例子
public class HW
{
int sum;
public HW(int a, int b)
{
super();
this.sum = a+b;
}
public void hello1(double c)
{
double newnumber = sum+c;
System.out.println("hello from hello1, new number= " + newnumber);
}
public void hello2()
{
System.out.println("hello from hello2, sum=" + sum);
}
}
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
public class TestMethodHandle
{
/**
* @param args
*/
public static void main(String[] args)
{
HW hw = new HW(10, 15);
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle mh;
try
{
mh = lookup.findVirtual(HW.class, "hello2",
MethodType.methodType(void.class));
mh.invoke(hw);
mh = lookup.findVirtual(HW.class, "hello1",
MethodType.methodType(void.class, double.class));
mh.invoke(hw, 20);
} catch (NoSuchMethodException e)
{
e.printStackTrace();
} catch (IllegalAccessException e)
{
e.printStackTrace();
} catch (Throwable e)
{
e.printStackTrace();
}
}