与类型推断相关的java泛型

时间:2016-02-02 12:58:16

标签: java

我是一个java新手,我有一些代码如下。

public interface TestJava<T extends MyClass, U> {
    public U func(T t);
}

问题是 U 完全依赖于 T ,因此如果确定 T U 是也确定了(宣布 U 是不必要的!)。例如,如果 T String ,那么 U 必须是 Integer ,而不能是其他人。在 C ++ 中,如果 T 是用户定义的类,则可以使用下面的关键字 typedef 轻松删除 U

class UserDefinedClass {
public:
    typedef int ReturnType;
};

template<class T> class TestCpp {
    T::ReturnType func(T t);
};

然而,java没有这样的关键字(据我所知),所以我不知道如何实现这一点。 请注意,java代码中的 T 是用户定义的对象,而不是 String Integer 或其他。 不要对这个例子感到困惑:)

1 个答案:

答案 0 :(得分:0)

你可以做的一件事是通过扩展界面来隐藏眼睛,然后再调用扩展界面。这里的要点是你不必传递第二种类型,如果你确定它总是(例如:整数*)相同。

public class MyClass{
  boolean truth;  
}

public interface Lame{       
}

public interface TestJava<T extends MyClass, U> {
    public U func(T t);
}

public interface TestJavaMore<T extends MyClass> extends Lame{
    public void funky();
}

public interface TestJavaEvenMore<T extends MyClass> extends TestJava<T, Integer> {

}

如果你有多个T和U类型组合,我认为我推荐的另一个解决方案是使用工厂创建一个具有你想要的类型的具体实例。这是您可以研究的常见模式,但在这种情况下,它类似于:

public class TestJavaImpl<T extends MyClass, U> implements TestJava{
        @Override
        public Object func(MyClass t) {
            throw new UnsupportedOperationException("Not supported yet."); 
        }
    }

    public TestJava TestJavaFactory(){
        TestJava testJava = null;
        if (true == true){
            testJava = new TestJavaImpl<MyClass, Integer>();
        } else {
            testJava = new TestJavaImpl<MyClass, Float>();
        }
        return testJava;
    }

*提示:请记住,你必须使用java和模板&#34;我不会&#34;我&#34; nteger