采用数组的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();