Java 如何实例化从具有任何类型的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

我的类ReadOnlyList是从泛型类型的ArrayList扩展而来的

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);