泛型除了标示类还有其他的作用吗?

 public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<String>();
        list.add("hello");
        list.add("world");
        list.add("java");
        for(String i : list){
            System.out.println(i);
        }

    }

为什么不声明泛型String之后用foreach遍历就会报错?泛型在这里起到的作用是什么.?

for-loop的底层使用的是iterator,试想你的程序编译器转化后和以下代码一致,就没问题
Iterator i = list.iterator();
while(iter.hasNext()) {
String i = iter.next(); //iterator.next()是string类型
}
如果不用范型,你的程序就是
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
String i = iterator.next(); // 看到问题了么,这里iteraotr.next()是object,类型转换失败啊
}

泛型限定了list的add方法只能添加进去string,而不能是别的类型。也保证了遍历的时候,取出来的都是string。
不知道你说的“不声明泛型String”报错是什么意思。本身你也可以用ArrayList的非泛型版本。
至于报错,肯定是你写的不合语法而已。