使用getter和java泛型方法参数
我有一个采用泛型参数类型的方法。我的情况是,将使用不同的参数类型调用此方法使用getter和java泛型方法参数,java,generics,type-inference,Java,Generics,Type Inference,我有一个采用泛型参数类型的方法。我的情况是,将使用不同的参数类型调用此方法 class something{ public void someMethod(){ List<A> listA = ....; //Class A have a field String Id; List<B> listB = ....; //Class B haave a field String Id; testMethod(list
class something{
public void someMethod(){
List<A> listA = ....; //Class A have a field String Id;
List<B> listB = ....; //Class B haave a field String Id;
testMethod(listA);
testMethod(listB);
}
private <T> void testMethod( List<T> list ){
for( T event : list ){
//TODO (something like): event.getId();
}
}
}
分类{
公共方法(){
List listA=..;//类A有一个字段字符串Id;
List listB=..;//类B有一个字段字符串Id;
试验方法(listA);
测试方法(listB);
}
私有void测试方法(列表){
对于(T事件:列表){
//TODO(类似于):event.getId();
}
}
}
在上述代码中,所有参数都将是
列表
。所有对象类型都有一个公共字段,需要使用getter获取其值。现在,由于方法定义是通用的,我如何实现这一点?这是无法实现的。在方法中,不能以相同的方式处理两个具有不兼容接口的不同列表,除非对instanceof
执行某些操作,即
public void testMethod(List<? extends Object> list) {
if(list.get(0) == null) return;
if(list.get(0) instanceof A) {
// Do the A stuff
} else {
// Do the B stuff
}
}
我不知道我是否真的理解你想要什么。
但是如果您知道,您将在列表中存储例如字符串,并希望使用
toUpperCase()
method,如何强制转换它?创建这样一个没有绑定类型的通用方法是没有意义的。因为T没有绑定到任何类型,所以不能在列表中的对象上使用特定的接口。因此,如果您希望testMethod获取任何类型的对象列表,您应该使用list
。定义方法通过扩展公共类/接口BaseType
,您可以这样做:
private <T extends BaseType> void testMethod( List<T> list ){
for( T event : list ){
//TODO (something like): event.getId();
}
}
private void测试方法(列表){
对于(T事件:列表){
//TODO(类似于):event.getId();
}
}
例子:
public void someMethod(){
List listA=Arrays.asList(新整数[]{1,4,9});
listB=Arrays.asList(新的Double[]{1.5,4.2,9.3});;
试验方法(listA);
测试方法(listB);
}
私有void测试方法(列表){
对于(T事件:列表){
//注意:此处调用的是intValue()方法
//在被T扩展的基类编号中
System.out.println(event.intValue());
}
}
让A
和B
实现一个公共接口,该接口有一个方法getID
:
interface SomeInterface {
String getID();
}
那么你可以:
private <T extends SomeInterface> void testMethod(List<T> list) {
for (T event : list) {
// now you can use `event.getID()` here
}
}
private void测试方法(列表){
对于(T事件:列表){
//现在可以在这里使用'event.getID()'
}
}
正如其他答案所说,您需要通过某个接口绑定类型参数。但对于您使用它的目的,您实际上不需要使用t
:
private void testMethod(List<? extends SomeInterface> list) {
for (SomeInterface event : list) {
// now you can use `event.getID()` here
}
}
private void testMethod(列表由于每次都会使用不同类型的参数调用该方法多次,因此类型转换似乎不可伸缩(我觉得它不是最理想的)因为如果我用20种不同的参数类型调用,我会包含20种类型转换。这很好,正是我所期望的。这避免了其他情况下需要的多种类型转换。非常感谢。感谢您的回复,但我认为有一个公共接口可以更好地避免类型转换。@Vijay它在某些情况下工作得更好。@Vijay我很高兴在你的情况下它能起作用。
private void testMethod(List<? extends SomeInterface> list) {
for (SomeInterface event : list) {
// now you can use `event.getID()` here
}
}