Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中如何求解方法的泛型输入参数_Java_Generics - Fatal编程技术网

java中如何求解方法的泛型输入参数

java中如何求解方法的泛型输入参数,java,generics,Java,Generics,以下内容无法编译。 我怎样才能解决它? 我想要一个方法或一种方法,接受泛型类型作为方法的输入,并将其委托给具体方法,而不使用instanceof或反射 public class MyCoolClass { void doSomthing(Double x) {} void doSomthing(Integer x) {} public <T extends Number> void setMe(T in) { doSomthing(in

以下内容无法编译。 我怎样才能解决它? 我想要一个方法或一种方法,接受泛型类型作为方法的输入,并将其委托给具体方法,而不使用
instanceof
或反射

public class MyCoolClass {

    void doSomthing(Double x) {}

    void doSomthing(Integer x) {}

    public <T extends Number> void setMe(T in) {

        doSomthing(in);

    }
}
公共类{
void doSomthing(双x){}
void doSomthing(整数x){}
公共无效设置时间(T英寸){
doSomthing(in);
}
}
我想要一个方法或一种方法,接受泛型类型作为方法的输入,并将其委托给具体方法,而不使用instanceof或reflection

public class MyCoolClass {

    void doSomthing(Double x) {}

    void doSomthing(Integer x) {}

    public <T extends Number> void setMe(T in) {

        doSomthing(in);

    }
}
如果控制泛型类型,则反转控件并将行为移动到泛型类型的接口中:

public interface MyInterface {
    void doSomething();
}

然后,您的
MyInterface
的特定实现将知道该做什么,从而避免
实例和反射。

您所要求的是不可能安全地执行的。。。你需要……的例子。。。然而,你需要问一下你在这里做的事情是否正确

public class MyCoolClass {

    void doSomthing(Double x) {}

    void doSomthing(Integer x) {}

    public <T extends Number> void setMe(T in) {

        doSomthing(in);

    }
}
避免实例的唯一方法是已知类型和编译时间,在这种情况下,调用代码应该能够调用正确的具体
doSomething
方法

否则,您的类或调用代码必须在某个地方执行该恼人的
实例


非实例的替代方案会陷入使用java反射API的困境,这要糟糕得多。

您的问题的答案似乎是: java不是C++。使用方法重载

用这样的内容替换示例类:

public class MyActuallyFunctioningClass
{
    public Integer blam(final Integer paramName) {}
    public Double blam(final Double paramName) {}
}
使用
Integer
参数时,将调用
Integer
版本
当您使用
Double
参数时,将调用
Double
版本。

为了编译,可以强制转换为
Double
Integer
doSomthing((Double)in)
如果删除
setMe
方法怎么办?@user7这是认真的回答吗?我不会创建这样的通用方法,因为您可能会收到类似
BigDecimal x
的参数(因为
BigDecimal
扩展自
Number
),并且您没有合适的
doSomthing
方法来支持它。只要将这些方法公开,让你的API客户端正确处理它。编译器不会接受它,因为他不知道你是否真的为扩展数字的每种类型(无限)提供了所有方法。你能给我一个例子吗?我不明白。接口不可用generic@user1409534
Number
是您正在处理的实际接口吗?