我可以在Java中使用嵌套泛型吗?

时间:2011-09-17 00:34:14

标签: java generics

我试图做类似的事情:


public class MyClass <A, B, C <A, B> > {
  ...
}

但Eclipse突出显示“B”,并表示“意外的,预期的延伸”。是什么赋予了?嵌套的泛型是不允许的?

5 个答案:

答案 0 :(得分:8)

这是因为您没有将C定义为本身键入2个类型参数的类型。
尝试这样的事情:

public class MyClass <A, B, C extends Map<A, B>> {
    // This compiles
}

答案 1 :(得分:3)

如果模板参数不共享共享类层次结构,则可以使用接口。

例如:

interface IConverter<TFrom, TTo>
{
    TTo convert(TFrom from);
}

class IntToStringConverter implements IConverter<Integer, String>
{
    public String convert(Integer from)
    {
        return "This is a string: " + from.toString();
    }
}

class ConverterUser<TConverter extends IConverter<TFrom, TTo>, TFrom, TTo>
{
    public ConverterUser()
    {
    }

    private List<TConverter> _converter2;

    private TConverter _converter;

    public void replaceConverter(TConverter converter)
    {
        _converter = converter;
    }

    public TTo convert(TFrom from)
    {
        return _converter.convert(from);
    }
}

class Test
{
    public static void main(String[] args)
    {
        ConverterUser<IntToStringConverter, Integer, String> converterUser =
            new ConverterUser<IntToStringConverter, Integer, String>();

        converterUser.replaceConverter(new IntToStringConverter());

        System.out.println(converterUser.convert(328));
    }
}

答案 2 :(得分:3)

这在Java中是不可能的。请参阅语言定义的Type Variables部分以及Generic Classes and Type Parameters。我最近看到(某处)提到Java无法做到这一点,但Scala可以做到这一点。这由Scala Language Specification的S4.4确认。

以下代码编译成功也证实了这一点。

class MyClass [A, B, C [A, B]] {
}

在java中编译产生了以下答案。

MyClass.java:1: > expected
class MyClass <A, B, C<A, B>> {
                      ^
MyClass.java:1: <identifier> expected
class MyClass <A, B, C<A, B>> {
                        ^
MyClass.java:1: ';' expected
class MyClass <A, B, C<A, B>> {
                           ^
MyClass.java:2: reached end of file while parsing
}
 ^
4 errors

我猜想你的问题有一个更简单的解决方案,因为这有点不寻常。

答案 3 :(得分:2)

您不必声明这样的嵌套类型。简单地

class MyClass<A, B, C> {}

当您创建MyClass时,您可以执行类似

的操作
MyClass<List<String>, Set<Date>, Map<Integer, Long>> instance;

答案 4 :(得分:1)

我猜你希望MyClass是一个带有类型参数A,B和C的泛型类。此外,你希望C是一个带有类型参数A和B的泛型类。

这样我就可以写

  1. MyClass < String , Date , Map < String , Date > >
  2. MyClass < String , Date , Hashtable < String , Date > > 但不是
  3. MyClass < String , Date , ElementVsitor < Date , String > >
  4. 然后我认为你不能那样做。