gpt4 book ai didi

java - 棘手的 Java 泛型 : generic class implementing non generic interface with generic Method

转载 作者:行者123 更新时间:2023-12-01 06:45:34 26 4
gpt4 key购买 nike

我有以下代码as seen in ideone.com :

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

问题在于 visit 中的类型 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类和 T 的参数参数 visit方法不相关,也不一定可以分配给另一个。如果Visitor本身就是一个参数化接口(interface)

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

那么你可以有MyVisitor<T> implements Visitor<T>那么 T 的就会是相同的。

请记住,泛型方法的要点是链接两个或多个参数的类型,或者将参数的类型链接到方法的返回类型(例如,采用某种类型的参数并返回相同类型的列表)。当泛型方法仅使用其参数一次时,它实际上不会从泛型中获得任何好处,即您将获得同样多的类型安全性

interface Visitor{
public void visit(Object Value);
}

就像你原来的 Visitor 一样界面。

关于java - 棘手的 Java 泛型 : generic class implementing non generic interface with generic Method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15947506/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com