采用数组的Java模板类;有没有办法强制执行?
我正在编写一个模板类,它应该以数组作为其类型采用数组的Java模板类;有没有办法强制执行?,java,Java,我正在编写一个模板类,它应该以数组作为其类型 public class Foo<T> {...} 公共类Foo{…} 如何最好地强制“T”是数组类型?(int[],Bar[],…)如果可能的话,最好是编译时,但如果T不是数组,那么在调试运行时抛出异常或其他异常的最佳方法是什么?不可能完全按照您的要求执行,也不可能让泛型类型指定数组或基元 语法允许以下内容: public class Foo <az09$_ extends MyClassOrInterface & S
public class Foo<T> {...}
公共类Foo{…}
如何最好地强制“T”是数组类型?(int[],Bar[],…)如果可能的话,最好是编译时,但如果T不是数组,那么在调试运行时抛出异常或其他异常的最佳方法是什么?不可能完全按照您的要求执行,也不可能让泛型类型指定数组或基元 语法允许以下内容:
public class Foo <az09$_ extends MyClassOrInterface & Serializable & Closeable> {...}
如果您确实想检查类型是否为数组,可以在运行时使用以下代码进行检查,尽管这有点麻烦,效率也不高:
public static boolean isArrayType (Object o) {
return o.getClass().isArray();
}
最终,这完全取决于你们想做什么。我同意并扩展答案。您可以将MyClass放在工厂类中,并使MyClass的构造函数私有。这样,只有工厂类中的代码才能直接实例化MyClass。由你来确保他们做正确的事情。可以将factory clas参数化(如下所示),也可以将make方法本身参数化
// T is the component type of the array
public class MyClassFactory < T >
{
// we can't directly enforce TARRAY=T[], but TARRAY=T[]
public final class MyClass < TARRAY >
{
private MyClass ( ... arguments ) throws ... exceptions { ... code }
// no non private constructors
.... more code
}
// this is the only way to construct a MyClass
// so we indirectly enforced TARRAY=T[]
public MyClass<T[]> make ( ... arguments ) throws ... exceptions
{
return new MyClass <T[]>( ... arguments ) ;
}
}
//T是数组的组件类型
公共类MyClassFactory
{
//我们不能直接强制TARRAY=t[],但TARRAY=t[]
公共期末班MyClass
{
私有MyClass(…参数)引发…异常{…代码}
//没有非私有构造函数
……更多代码
}
//这是构造MyClass的唯一方法
//所以我们间接地强制了TARRAY=T[]
公共MyClass make(…参数)引发…异常
{
返回新的MyClass(…参数);
}
}
@emory正在寻找一种无需运行时检查的干净方法。就个人而言,我关心类型名的可读性——这里有一个使用内部类的非常紧凑的示例,我认为最后得到的类型名非常可读
public static class Bar {}
public static class Foo<T> {
public static class Array<TA> {
private Array() {}
}
public Array<T[]> make() {
return new Array();
}
}
Foo.Array<Bar[]> fooray = new Foo<Bar>().make();
公共静态类栏{}
公共静态类Foo{
公共静态类数组{
专用数组(){}
}
公共数组make(){
返回新数组();
}
}
数组fooray=newfoo().make();
我认为你做不到。例如,我不认为这个列表可以编译。您应该在代码中使用T作为T[]使其成为数组类型;先测试再思考:)。这是一个字符串数组列表,就像二维数组一样。为什么你不认为这是有效的?对于这种方法,clazz.isArray()+clazz.getComponentType()可以为你提供所有的数组信息。谢谢!我用你的方法确定了答案,这绝对是比我以前使用的更好的方法。这不是对问题的正确答案,至少不像我所问的那样。这保证了processIt方法被传递一个T对象数组,这与确保T本身是数组是完全不同的。我认为这是一个很好的观点,我会接受的。出于某种原因,我没有考虑t是数组元素类型而不是数组类型,当然,在构造函数中(或任何地方)要求t[]确实可以强制执行t的数组。@LordArtemis足够公平。添加了明确的“不,你不能完全按照要求那样做”信息。
public static class Bar {}
public static class Foo<T> {
public static class Array<TA> {
private Array() {}
}
public Array<T[]> make() {
return new Array();
}
}
Foo.Array<Bar[]> fooray = new Foo<Bar>().make();