当前位置: 首页 > 知识库问答 >
问题:

棘手的Java泛型:用泛型方法实现非泛型接口的泛型类

白泽语
2023-03-14
import java.util.*;

class Test{
   interface Visitor{
        public <T> void visit(T Value);
   }

   class MyVisitor<T> implements Visitor{
        List<T> list = new  ArrayList<T>();

        public <T> void visit(T value){
           list.add(value);
        }
    }
}

编译时,此代码将产生以下+错误:

 Main.java:12: error: no suitable method found for add(T#1)
             list.add(value);
                 ^
     method List.add(int,T#2) is not applicable
       (actual and formal argument lists differ in length)
     method List.add(T#2) is not applicable
       (actual argument T#1 cannot be converted to T#2 by method invocation conversion)   where T#1,T#2 are type-variables:
     T#1 extends Object declared in method visit(T#1)
     T#2 extends Object declared in class Test.MyVisitor 1 error

问题是访问中的类型T与列表中的T不相同。如何修复此编译问题?


共有1个答案

范成周
2023-03-14
class MyVisitor<T> implements Visitor{
    List<T> list = new  ArrayList<T>();

    public <T> void visit(T value){
       list.add(value);
    }
}

相当于

class MyVisitor<T> implements Visitor{
    List<T> list = new  ArrayList<T>();

    public <V> void visit(V value){
       list.add(value);
    }
}

也就是说,类的t参数和visit方法的t参数不相关,两者都不一定可以分配给另一个。如果访问者本身是参数化接口

interface Visitor<V>{
    public void visit(V Value);
}

然后您可以使用MyVisitor implements visitor ,然后T将是相同的。

interface Visitor{
    public void visit(Object Value);
}
 类似资料:
  • 问题内容: 我有一个代表文本片段的泛型类。该文本片段可能具有多种不同模式(突出显示的不同类型)中的任何一种。这些模式用枚举表示。每个项目的Enum可能不同,但是它必须实现一个接口,该接口提供了一种将其中两个结合的方法(可以突出显示并加粗显示)。所以我有一个界面: 然后我的TextFragment是文本字符串和模式的容器。但是当我尝试声明该类时: 我收到以下错误: 令牌“扩展”的语法错误,预期 根据

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • 问题内容: 如果在Java中创建泛型类(该类具有泛型类型参数),则可以使用泛型方法(该方法带有泛型类型参数)吗? 考虑以下示例: 正如您对通用方法所期望的那样,我可以使用任何对象调用的实例: 但是,如果我尝试使用 不 指定泛型类型的实例,则无论传入什么,我都会调用返回, 奇怪的是,如果返回类型是通用类,它将编译(例如(实际上,这可以解释-参见下面的答案)): 此外,如果输入通用类,即使仅使用通配符

  • 如果在Java中创建泛型类(该类具有泛型类型参数),是否可以使用泛型方法(该方法采用泛型类型参数)? 考虑下面的例子: 正如您所期望的那样,对于任何对象,的实例,我都可以调用: 但是,如果我试图使用的实例而不指定泛型类型,那么调用将返回一个

  • 问题内容: 我有一个旧类,该类本身不是泛型,但其方法返回类型之一使用泛型: 使用泛型返回字符串的集合。因此,我可以进行遍历,而无需将元素强制转换为: 但是,如果我将自己更改为通用名称,但其他所有内容均保持不变: 然后继续使用对的非泛型引用,不再返回,而是返回非类型。因此,客户端代码无法编译: 为什么是这样?有哪些解决方法? 我的猜测是,通过使用对泛型类的非泛型引用,Java将关闭整个类的所有泛型。