设置迭代器的Java泛型

设置迭代器的Java泛型,java,generics,for-loop,iterator,Java,Generics,For Loop,Iterator,当我使用实现ArrayList并更改元素的泛型类型的类时,我注意到Java做了一些有趣的事情(或者至少是Netbeans)。我基本上创建了一个抽象类,它扩展了ArrayList和一些子类,这些子类应该与String对象一起工作(比如ArrayList)。我为实现这一目标所做的一件事是: public abstract class A extends ArrayList { ... } @Override public abstract class B extends A { publ

当我使用实现
ArrayList
并更改元素的泛型类型的类时,我注意到Java做了一些有趣的事情(或者至少是Netbeans)。我基本上创建了一个抽象类,它扩展了
ArrayList
和一些子类,这些子类应该与
String
对象一起工作(比如
ArrayList
)。我为实现这一目标所做的一件事是:

public abstract class A extends ArrayList {
   ...
}
@Override
public abstract class B extends A {
   public Iterator<String> iterator() {
      return super.iterator();
   }
}
public abstract class A extends ArrayList {
   ...
}
public abstract class B<String> extends A {
   @Override
   public Iterator<String> iterator() {
      return super.iterator();
   }
}

您知道为什么会发生这种情况吗?如果不实现自己的迭代器,我如何修复它?

使用组合而不是继承

    public class A implements Iterable<String>{
        List<String> myList = new ArrayList<String>();
        //do operations on myList
        public Iterator<String> iterator() {
             return myList.iterator();
        }
    }
公共类A实现了Iterable{
List myList=new ArrayList();
//对myList执行操作
公共迭代器迭代器(){
返回myList.iterator();
}
}

使用组合而不是继承

    public class A implements Iterable<String>{
        List<String> myList = new ArrayList<String>();
        //do operations on myList
        public Iterator<String> iterator() {
             return myList.iterator();
        }
    }
公共类A实现了Iterable{
List myList=new ArrayList();
//对myList执行操作
公共迭代器迭代器(){
返回myList.iterator();
}
}

不确定您想做什么,但如果我理解正确,您需要一个扩展ArrayList并具有通用类型字符串的类。。。也许你正在寻找这个:

public abstract class A<T> extends ArrayList<T> {
    ...
}
public abstract class B extends A<String> {
    ...
}

会很好用的。虽然我认为你可以想出一个更好的解决办法。您有关于您的问题的更多详细信息吗?

不确定您想做什么,但如果我理解正确,您需要一个扩展ArrayList并具有一般类型字符串的类。。。也许你正在寻找这个:

public abstract class A<T> extends ArrayList<T> {
    ...
}
public abstract class B extends A<String> {
    ...
}

会很好用的。虽然我认为你可以想出一个更好的解决办法。关于您的问题,您有更多的细节吗?

如果您扩展泛型类,您应该关心泛型。我的意思是你的声明应该是

public abstract class A extends ArrayList<String> {
   ...
}
这就是“奇怪”行为的原因


顺便问一下,为什么要扩展
ArrayList
?听起来真的很奇怪

如果您扩展泛型类,您应该关心泛型。我的意思是你的声明应该是

public abstract class A extends ArrayList<String> {
   ...
}
这就是“奇怪”行为的原因

顺便问一下,为什么要扩展
ArrayList
?听起来真的很奇怪

天哪,这太可怕了:

public abstract class B<String> extends A {
   @Override
   public Iterator<String> iterator() {
      return super.iterator();
   }
}
公共抽象类B扩展了{
@凌驾
公共迭代器迭代器(){
返回super.iterator();
}
}
String
不是类
String
,相反,您正在声明一个名为
String
(如
T
)的新类型变量,该变量隐藏类
String

OMG这很糟糕:

public abstract class B<String> extends A {
   @Override
   public Iterator<String> iterator() {
      return super.iterator();
   }
}
公共抽象类B扩展了{
@凌驾
公共迭代器迭代器(){
返回super.iterator();
}
}

String
不是类
String
,相反,您正在声明一个名为
String
(如
T
)的新类型变量,该变量通常隐藏类
String

,您应该()。为什么首先要扩展
ArrayList
?您的意思是,在for循环中,s的类型是Object而不是String?通常您应该()。为什么首先要扩展
ArrayList
?你的意思是在for循环中,s的类型是Object而不是String?谢谢,这就是我要做的。不过,您建议使用什么来代替呢?@Aleksandar,我想我只是不明白抽象基类(
A
在本例中)的用途。你能详细介绍一下吗?谢谢,这就是我想做的。不过,您建议使用什么来代替呢?@Aleksandar,我想我只是不明白抽象基类(
A
在本例中)的用途。你能详细介绍一下吗?