Java泛型仅支持预定义的数据类型

时间:2011-10-29 18:00:36

标签: java generics

我想在java中使用define一个泛型类,它只能使用我所有共享相同基类的自定义数据类型来实例化。是否可以在不运行时检查数据类型的情况下这样做?此外,我想禁止在不提供数据类型的情况下实例化泛型类。

编辑: 我为我的c ++库编写了一个java包装器,因此java类应该只允许我的c ++数据类型的包装类作为参数。我刚刚尝试使用有界类型参数,但是我仍然可以实例化这样的对象:

MyClass c = new MyClass(); 

这基本上就是代码:

public class MyClass<T extends MyType>
{ 
    public MyClass()
    {

    }

    public doSomething(MyOtherClass<T> other)
    {

    }
}

3 个答案:

答案 0 :(得分:2)

您要找的是Bounded Type Parameters

  

有时您可能希望限制允许传递给类型参数的类型。例如,对数字进行操作的方法可能只想接受Number或其子类的实例。这是有界类型参数的用途。

public <U extends Number> void inspect(U u){
    System.out.println("T: " + t.getClass().getName());
    System.out.println("U: " + u.getClass().getName());
}

答案 1 :(得分:2)

由于类型擦除 - 以及现在对向后兼容性的旧要求 - 无法要求使用泛型类型参数实例化类。两种解决方案:

  1. 留意警告。让那些不感到运行时异常愤怒的开发人员: - )
  2. 仅允许通过扩展泛型类的类进行访问(并提供类型参数)。例如,class MyClassFoo extends MyClass<Foo>然后从外部代码中隐藏MyClass构造函数。
  3. 两者都不是理想的,但它就是它的本质。 C ++和.NET的工作方式不同,但它们又是C ++ / .NET而不是Java: - )

    快乐的编码。

答案 2 :(得分:1)

如果您担心其他人创建自己的基类子类并在您的泛型类型中使用它,那么禁止这种情况的唯一方法是控制对基类的扩展。

一种方法是使用默认可见性保护基类的构造函数,并将具体实现放在同一个类中。使这些具体实现最终,或使其构造函数成为私有。