想象一下用C#编写的以下代码:
public class Provider<T>
{
T GetValue(); // implementation skipped for brevity
}
//
public class Converter<T1, T2>
{
T2 Convert(T1 value);// implementation skipped for brevity
}
//
public class SomeClass // No Generics Here
{
public T2 DoSomething<T1, T2>()
{
T1 value = new Provider<T1>().GetValue();
T2 result = new Converter<T1, T2>().Convert(value);
return result;
}
}
// and the usage
...
SomeClass some = new SomeClass();
SomeOtherType result = some.DoSomething<SomeType, SomeOtherType>();
是否有可能用Java实现相同的目标 - 我想知道如何通过在方法用法中提供类型参数来调用Java中的方法,如上所述。我在.NET中完成了这个,我知道Java支持类型约束和推理,我只是搞砸了语法。
答案 0 :(得分:2)
提供者和转换器都很好,你的DoSomething方法应该像这样重写:
public <T1, T2> T2 doSomething() {
T1 value = new Provider<T1>().GetValue();
T2 result = new Converter<T1, T2>().Convert(value);
return result;
}
可以这样使用:
SomeClass instance = new SomeClass();
Integer something = instance.<String, Integer>doSomething();
答案 1 :(得分:1)
这是一个Java类,它使用了一些可以作为参考的泛型。实际上,Java的泛型与C ++ / C#模板并不完全相同。但是有了一些限制和一些繁琐的Java编译器警告,你可以使用Java的Generics实现类似的模板。
public class Parameter {
/* Innerclass used for holding a generic value.
*
*/
protected class Value<T> {
protected T val;
public void set(T val) {
this.val = val;
}
public T get() {
return val;
}
}
// Parameter name
String name;
// Parameter value
Value value;
/* Construct with empty name and value pair.
* Use the set method for getting something meaningful.
*/
public Parameter() {}
/* Construct with name and value pair.
*
*/
public <V> Parameter(String name, V value) {
set(name, value);
}
/* Set name and value pair.
*
*/
public <V> void set(String name, V value) {
this.name = name;
this.value = new Value();
this.value.set(value);
}
/* Get the parameter name.
*
*/
public String getName() {
return name;
}
/* Get the parameter value.
*
*/
public <V> V getValue() {
//! NOTE the caller must be sure that the proper value type is carried out.
return ((Value<V>) value).get();
}
/* Set the parameter value.
*
*/
public <V> void setValue(V value) throws Exception {
//! NOTE the caller must be sure that the proper value type is used.
if (value.getClass() != this.value.get().getClass() ) {
throw new Exception( "trying to set an incompatible parameter value" );
}
this.value.set(value);
}
/* Return the value class.
*
*/
public Class getValueType() {
return value.get().getClass();
}
}