我想在java中使用define一个泛型类,它只能使用我所有共享相同基类的自定义数据类型来实例化。是否可以在不运行时检查数据类型的情况下这样做?此外,我想禁止在不提供数据类型的情况下实例化泛型类。
编辑: 我为我的c ++库编写了一个java包装器,因此java类应该只允许我的c ++数据类型的包装类作为参数。我刚刚尝试使用有界类型参数,但是我仍然可以实例化这样的对象:
MyClass c = new MyClass();
这基本上就是代码:
public class MyClass<T extends MyType>
{
public MyClass()
{
}
public doSomething(MyOtherClass<T> other)
{
}
}
答案 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)
由于类型擦除 - 以及现在对向后兼容性的旧要求 - 无法要求使用泛型类型参数实例化类。两种解决方案:
class MyClassFoo extends MyClass<Foo>
然后从外部代码中隐藏MyClass
构造函数。两者都不是理想的,但它就是它的本质。 C ++和.NET的工作方式不同,但它们又是C ++ / .NET而不是Java: - )
快乐的编码。
答案 2 :(得分:1)
如果您担心其他人创建自己的基类子类并在您的泛型类型中使用它,那么禁止这种情况的唯一方法是控制对基类的扩展。
一种方法是使用默认可见性保护基类的构造函数,并将具体实现放在同一个类中。使这些具体实现最终,或使其构造函数成为私有。