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不相同。如何修复此编译问题?
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
,然后T将是相同的。
interface Visitor{
public void visit(Object Value);
}
会很好?或:
问题内容: 我有一个代表文本片段的泛型类。该文本片段可能具有多种不同模式(突出显示的不同类型)中的任何一种。这些模式用枚举表示。每个项目的Enum可能不同,但是它必须实现一个接口,该接口提供了一种将其中两个结合的方法(可以突出显示并加粗显示)。所以我有一个界面: 然后我的TextFragment是文本字符串和模式的容器。但是当我尝试声明该类时: 我收到以下错误: 令牌“扩展”的语法错误,预期 根据
如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或
问题内容: 如果在Java中创建泛型类(该类具有泛型类型参数),则可以使用泛型方法(该方法带有泛型类型参数)吗? 考虑以下示例: 正如您对通用方法所期望的那样,我可以使用任何对象调用的实例: 但是,如果我尝试使用 不 指定泛型类型的实例,则无论传入什么,我都会调用返回, 奇怪的是,如果返回类型是通用类,它将编译(例如(实际上,这可以解释-参见下面的答案)): 此外,如果输入通用类,即使仅使用通配符
如果在Java中创建泛型类(该类具有泛型类型参数),是否可以使用泛型方法(该方法采用泛型类型参数)? 考虑下面的例子: 正如您所期望的那样,对于任何对象,的实例,我都可以调用: 但是,如果我试图使用的实例而不指定泛型类型,那么调用将返回一个
问题内容: 我有一个旧类,该类本身不是泛型,但其方法返回类型之一使用泛型: 使用泛型返回字符串的集合。因此,我可以进行遍历,而无需将元素强制转换为: 但是,如果我将自己更改为通用名称,但其他所有内容均保持不变: 然后继续使用对的非泛型引用,不再返回,而是返回非类型。因此,客户端代码无法编译: 为什么是这样?有哪些解决方法? 我的猜测是,通过使用对泛型类的非泛型引用,Java将关闭整个类的所有泛型。