方法在不同类型参数上加载错误

时间:2015-12-29 06:30:31

标签: java android generics overloading

在android中处理我的项目时,我遇到了与方法重载相关的这个奇怪的问题(可能是我对java中缺乏理解泛型)。我在实用程序类中定义了以下静态方法,它给了我错误。

public static void getAllFromDatabase(Context context, ArrayList<Student> students) {
    DatabaseHelper dh = new DatabaseHelper(context);
    students = dh.getStudents();
    dh.close();
}

public static void getAllFromDatabase(Context context, ArrayList<LogEntry> logs) {
    DatabaseHelper dh = new DatabaseHelper(context);
    logs = dh.getlog();
    dh.close();
}

有任何帮助吗?提前谢谢。

5 个答案:

答案 0 :(得分:0)

Remember to put the type parameter in the class definition.

- (IBAction)editButtonClicked:(id)sender {

AVAssetImageGenerator *imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:self.asset];
imageGenerator.maximumSize = CGSizeMake(200.0f,0.0f);

CMTime duration = self.asset.duration;
NSMutableArray *times = [NSMutableArray array];
CMTimeValue increment = duration.value/20;
NSLog(@"%lld",increment);
CMTimeValue currentValue = 0;
while (currentValue <= duration.value) {
     NSLog(@"%lld",increment);
     NSLog(@"currentValue==%lld",currentValue);
    CMTime time = CMTimeMake(currentValue, duration.timescale);
    CMTimeShow(time);
    [times addObject:[NSValue valueWithCMTime:time]];
    currentValue+=increment;
    NSLog(@"%lld",increment);
    NSLog(@"currentValue===%lld",currentValue);
}

__block NSUInteger imageCount = times.count;
__block NSMutableArray *images = [NSMutableArray array];

     __block  AVAssetImageGeneratorCompletionHandler handler;
[imageGenerator generateCGImagesAsynchronouslyForTimes:times completionHandler:^(CMTime requestedTime, CGImageRef  image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError * _Nullable error) {
     static NSInteger counter = 0;
    if (result == AVAssetImageGeneratorSucceeded) {
        UIImage *image1 = [UIImage imageWithCGImage:image];
        [images addObject:image1];
        NSLog(@"%@",images);
        counter++;
        NSLog(@"%ld",(long)counter);
        if(counter == imageCount){
            NSLog(@"inside if");

            dispatch_async(dispatch_get_main_queue(), ^{ // 2
                MyTableViewController *myTableVC = [self.storyboard instantiateViewControllerWithIdentifier:@"MyTableViewController"];

             myTableVC.images = [images mutableCopy];
                [self.navigationController pushViewController:myTableVC animated:YES];
            });


        }
    }
    else{
        NSLog(@"Failed to create thumbNail image");
    }
}];

您可以在https://docs.oracle.com/javase/tutorial/java/generics/types.html

上引用它

答案 1 :(得分:0)

由于类型擦除过程,您遇到此问题,因为此后两种方法都相同。

来自Doc

  

在类型擦除过程中,Java编译器会擦除所有类型   参数并用类型的第一个边界替换每个参数   参数是有界的,如果类型参数是无界的,则为Object。

请参阅Java generics - type erasure - when and what happens

答案 2 :(得分:0)

这是因为 当Java实现泛型时,为了使字节码向后兼容,java擦除了使签名成为通用的类型,在运行时通用信息消失了,签名看起来像:

public static void getAllFromDatabase(Context context, ArrayList students);
public static void getAllFromDatabase(Context context, ArrayList logs); 

因此,您有两个具有相同类型参数的方法,因此您将收到错误。 尝试更多; http://docs.oracle.com/javase/tutorial/java/generics/erasure.html

答案 3 :(得分:0)

大概是因为擦除;如果Java从一开始就有泛型,那么这可能不会发生。您可能会将两个参数视为不同的类型,但是当&lt;&gt;时如果删除,JVM将会看到两个方法,其中Map是其参数的类型。

您可以通过为方法提供不同的返回类型来作弊。虽然擦除后它们都具有相同的名称和参数,但字节代码会有所不同,因为整个签名不一样 - 返回类型不同

答案 4 :(得分:0)

由于Type Erasure,您收到错误。类型Erasure在编译时删除所有泛型信息。

方法解析在编译时进行,并且不考虑类型参数。

Java泛型使用类型擦除。括号<Student><LogEntry>中的位被删除,因此您最终会得到两个具有相同签名的方法。这是不允许的,因为运行时不知道每个案例使用哪个。