Java 如何实例化从具有任何类型的ArrayList扩展而来的类?
我的类ReadOnlyList是从泛型类型的ArrayList扩展而来的Java 如何实例化从具有任何类型的ArrayList扩展而来的类?,java,generics,Java,Generics,我的类ReadOnlyList是从泛型类型的ArrayList扩展而来的 public class ReadOnlyList<T> extends ArrayList<T> { public ReadOnlyList(ArrayList<T> list) { super(list); } public boolean add(String s) throws UnsupportedOperat
public class ReadOnlyList<T> extends ArrayList<T> {
public ReadOnlyList(ArrayList<T> list) {
super(list);
}
public boolean add(String s) throws UnsupportedOperationException{
throw new UnsupportedOperationException("Not supported");
}
public static void main(String[] args){
ArrayList<String> myList = new ArrayList<>();
myList.add("abc");
myList.add("xyz");
ReadOnlyList<T> readOnlyList = new ReadOnlyList<T>(readOnlyList);
}
}
公共类ReadOnlyList扩展了ArrayList{
公共只读列表(ArrayList列表){
超级(名单);
}
公共布尔添加(字符串s)引发UnsupportedOperationException{
抛出新的UnsupportedOperationException(“不受支持”);
}
公共静态void main(字符串[]args){
ArrayList myList=新的ArrayList();
myList.add(“abc”);
myList.add(“xyz”);
ReadOnlyList ReadOnlyList=新的ReadOnlyList(ReadOnlyList);
}
}
ReadOnlyList ReadOnlyList=new ReadOnlyList…
给出编译器错误“无法对非静态类型T进行静态引用。我理解错误(实例应该具有字符串之类的特定类型,而不是T。但我的问题是:如何通过ReadOnlyList>实例化类型为ReadOnlyList
的实例(ArrayList)
本身而不将其私有化
Java泛型没有提供任何其他方法吗?任何指向特定需求的url指针也可以。声明ReadOnlyList时需要指定类型: 例如:
ReadOnlyList ReadOnlyList=新的ReadOnlyList(myList);
您报告的实际问题是因为您试图访问类型变量T
,该变量在静态方法中与ReadOnlyList
的实例关联,而该方法与ReadOnlyList
的实例不关联
您需要使用范围内的符号,例如:
ReadOnlyList<String> readOnlyList = new ReadOnlyList<>(readOnlyList);
ReadOnlyList ReadOnlyList=新的ReadOnlyList(ReadOnlyList);
您的列表不是只读的:
- 您仍然可以设置其元素
- 可以删除元素
- 您可以使用
重载添加元素add(int,E)
- 您可能可以通过
和addAll
子列表(…)添加元素
Collections.unmodifiableList
为你提供了一个实现这一点的标准方法,以及List.of
在较新版本的Java中,ImmutableList
在Guava中等等
通过扩展
AbstractList
,您可以实现自己的功能,它提供了方法的框架实现,Javadoc提供了针对只读、可写但固定大小、可变大小的列表等重写哪些方法的说明。这是否回答了您的问题?为什么不ReadOnlyList ReadOnlyList=new ReadOnlyList(只读列表)
?不要扩展ArrayList
-检查有效的Java以了解原因。扩展AbstractList
@DontKnowMuchButgetingBetter:url中的SuggeAction:使构造函数私有,并将newInstance方法公开。这不是我想要的,尽管这会消除错误。没有其他方法提供吗任何指向特定需求的url指针也将使用内联代码格式,尤其是包含中的内容的代码,如
ReadOnlyList
,否则此站点无法正确显示,会造成很多混乱如果我正确理解问题,这是正确的回答。当我尝试上面的代码时,给出了相同的编译器错误。让我知道它是否在你的机器上工作。是的-main方法尝试使用/实例化ReadOnlyList
,但问题是,如何通过提供ArrayList
来创建ReadOnlyList ReadOnlyList
…当然ArrayList>
必须是ArrayList
才能工作…如果是这样,将列表中的元素解压到ReadOnlyList
-然后逻辑将进入构造函数以执行此操作。如果将main
方法的最后一行修改为我在上面发布的方法,则将有一个ReadOnlyList
。如果r您想使用new ReadOnlyList(new ArrayList())创建它
您的构造函数需要从ArrayList中解包字符串
元素,并有效地移除ArrayList包装。我知道它不完整……但这是一个示例代码。有时,我们尝试做一些事情,即使它在一行中可用,例如Collections.unmodifiableList。这更能理解如何制作东西当我需要这样的东西时就工作。
ReadOnlyList<String> readOnlyList = new ReadOnlyList<>(readOnlyList);