在Java中调用泛型方法时如何显式提供类型参数?

时间:2012-01-03 16:26:29

标签: c# java generics explicit

想象一下用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支持类型约束和推理,我只是搞砸了语法。

2 个答案:

答案 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();
    }
}